TypeScript中的interface和Type Alias的异同比较
2024-01-17 13:40:48
interface和Type Alias都是TypeScript中用于类型检查的工具,它们都可以用来定义类型,并对变量和函数进行类型标注。
**1. 定义方式**
interface的定义方式是使用`interface`,后面跟上接口名和接口体。接口体中可以定义属性、方法、索引签名和泛型参数等。
interface Person {
name: string;
age: number;
greet(phrase: string): void;
}
Type Alias的定义方式是使用`type`关键字,后面跟上类型别名和类型定义。类型定义可以是基本类型、联合类型、交集类型、元组类型、数组类型、对象类型、函数类型、枚举类型或另一个类型别名。
type PersonType = {
name: string;
age: number;
greet(phrase: string): void;
};
**2. 可选属性**
在interface中,属性可以是可选的,这意味着它们可以不赋值。在Type Alias中,属性不能是可选的,必须始终赋值。
interface Person {
name: string;
age?: number; // 可选属性
greet(phrase: string): void;
}
type PersonType = {
name: string;
age: number; // 必须赋值
greet(phrase: string): void;
};
**3. 继承**
interface可以继承其他interface,Type Alias不能继承其他类型别名。
interface Person {
name: string;
age: number;
greet(phrase: string): void;
}
interface Employee extends Person {
jobTitle: string;
salary: number;
}
**4. 可见性**
interface中的成员默认是public的,Type Alias中的成员默认是private的。
interface Person {
public name: string;
public age: number;
public greet(phrase: string): void;
}
type PersonType = {
private name: string;
private age: number;
private greet(phrase: string): void;
};
**5. 实例化**
interface不能被实例化,Type Alias可以被实例化。
interface Person {
name: string;
age: number;
greet(phrase: string): void;
}
type PersonType = {
name: string;
age: number;
greet(phrase: string): void;
};
const person: PersonType = {
name: 'John Doe',
age: 30,
greet(phrase: string) {
console.log(phrase);
}
};
**6. 使用场景**
interface通常用于定义对象类型和函数类型,Type Alias通常用于定义基本类型和联合类型。
interface Person {
name: string;
age: number;
greet(phrase: string): void;
}
type NumberOrString = number | string;
const person: Person = {
name: 'John Doe',
age: 30,
greet(phrase: string) {
console.log(phrase);
}
};
const numberOrString: NumberOrString = 10;
**7. 总结**
interface和Type Alias都是TypeScript中用于类型检查的工具,它们都有各自的优缺点。在实际开发中,我们可以根据不同的需求选择合适的工具。