type 和 interface 都可以定义对象,二者到底有何区别?
interface Person {
age: number
name: string
}
type Person = {
age: number
name: string
};
type 和 interface 都可以定义对象,二者到底有何区别?
interface Person {
age: number
name: string
}
type Person = {
age: number
name: string
};
在 TypeScript 中,interface
和 type
都可以用来定义对象的形状(shape),但它们之间确实有一些关键的区别。
* `interface` 可以被声明合并,这意味着你可以在不同的地方声明同一个 `interface`,并且这些声明会被合并成一个。
* `type` 则不能声明合并。
* `interface` 支持继承,这意味着一个 `interface` 可以继承另一个 `interface` 的成员。
* `type` 不支持继承。
* `type` 可以是任何有效的 TypeScript 类型,包括基本类型、联合类型、交叉类型、元组等。这使得 `type` 更加灵活,可以用来创建复杂的类型结构。
* `interface` 不能用作类型别名。
* `type` 可以被初始化为一个具体的值或对象,而 `interface` 不能。
* 使用 `type` 可以更清晰地表示函数类型,特别是当函数参数或返回值是复杂类型时。
* `interface` 在表示函数类型方面相对较弱。
对于你给出的例子,Person
接口和 Person
类型定义在功能上是等价的,它们都定义了一个对象,该对象具有 age
(数字类型)和 name
(字符串类型)两个属性。但是,如果你需要更复杂的类型定义或需要利用上述 type
和 interface
之间的区别,那么你可能会选择其中之一。
总的来说,选择使用 interface
还是 type
取决于你的具体需求和偏好。在 TypeScript 的早期版本中,interface
是主要的类型定义方式,但随着 type
的引入和功能的增强,type
也变得越来越流行。
以下是AI的回答
interface:
interface Person {
name: string;
age: number;
}
const person: Person = {
name: "Alice",
age: 30
};
type:
type
则更像是取了个别名。type Point = {
x: number;
y: number;
};
const point: Point = {
x: 10,
y: 20
};
interface
。type
。
1. type 可以声明基本类型,而 interface 不行
type
可以声明基本类型interface
只能用来声明复杂类型(对象和函数)2. 扩展时表现不同
interface
时,TS 将检查扩展的接口是否可以赋值给被扩展的接口。交叉类型
时则不会出现这种情况。我们将上述代码中的接口改写成类型别名,把extends
换成交集运算符&
,TS 将尽其所能把扩展和被扩展的类型组合在一起,而不会抛出编译时错误。3. 多次定义时表现不同
interface
多次的声明会合并。type
不能重复声明。interface
可以定义多次,多次的声明会合并。type
如果定义多次,会报错。