返回

TypeScript中的interface和Type Alias的异同比较

前端







interfaceType 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可以继承其他interfaceType 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. 总结** 

interfaceType Alias都是TypeScript中用于类型检查的工具,它们都有各自的优缺点。在实际开发中,我们可以根据不同的需求选择合适的工具。