TypeScript中 type和interface的区别
在 TypeScript 中,type
和 interface
都用于定义自定义类型,但它们在某些方面有所不同。本文将详细说明它们的区别,并通过示例来展示它们的使用场景。
1. 基本定义
type
type
关键字用于定义类型别名,可以为任何类型(包括原始类型、联合类型、交叉类型等)创建一个别名。
type StringOrNumber = string | number;
interface
interface
关键字用于定义对象的形状,通常用于描述对象的属性和方法。
interface Person {
name: string;
age: number;
}
2. 扩展性
type
type
可以通过交叉类型(&)来扩展。
type Animal = {
name: string;
};
type Dog = Animal & {
breed: string;
};
interface
interface
可以通过继承(extends)来扩展。
interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}
3. 合并声明
type
type 不支持合并声明。如果尝试定义同名的 type,TypeScript 会报错。
type Person = {
name: string;
};
// 错误:重复标识符 'Person'
type Person = {
age: number;
};
interface
interface
支持合并声明。如果定义了同名的 interface,TypeScript 会自动合并它们的属性。
interface Person {
name: string;
}
interface Person {
age: number;
}
// 最终 Person 接口包含 name 和 age 两个属性
const person: Person = {
name: "Alice",
age: 30,
};
4. 使用场景
type
type 更适合用于定义联合类型、交叉类型、元组等复杂类型。
type ID = string | number;
type Coordinates = [number, number];
interface
interface
更适合用于定义对象的形状,尤其是在面向对象编程中描述类的结构。
interface User {
id: number;
username: string;
login(): void;
}
class Admin implements User {
id: number;
username: string;
constructor(id: number, username: string) {
this.id = id;
this.username = username;
}
login() {
console.log("Admin logged in");
}
}