TypeScript中,type、interface、class的区别
type
用于定义对象类型别名、联合类型、交叉类型等等
// 类型别名
type Name = { name: string };
// 联合类型
type StringOrNumber = string | number;
// 交叉类型
type Name = { name: string };
type Age = { age: number };
type Person = Name & Age;
interface
定义对象类型的另一种方式
type 和 interface 非常相似,在很多场景下,两者可以自由选择。interface 的大部分特性在 type 上是适用的,关键的区别在于 interface 可扩展,能够声明合并,而 type 需要声明新的类型来增加新属性
interface User {
name: string
age: number
}
interface User {
sex: string
}
/**
User 接口为 {
name: string
age: number
sex: string
}
*/
type User {
name: string
age: number
}
type User {
gender: string
}
// Error: Duplicate identifier 'User'.
type Person = User & {
gender: string
}
interface 能够继承和实现
// 继承
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
let square: <Square> = {};
square.color = "blue";
square.sideLength = 10;
// 实现
interface ClockInterface {
currentTime: Date;
}
class Clock implements ClockInterface {
currentTime: Date;
constructor(h: number, m: number) { }
}
class
也是用来定义对象类型的,包含属性和方法实现。与 type 和 interface 不同的是 class 定义的类型信息会保存在编译后的代码中。
class User {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello(): void {
console.log(`Hello, my name is ${this.name}`);
}
}
class Employee extends User {
role: string;
constructor(name: string, age: number, role: string) {
super(name, age);
this.role = role;
}
}
总结
虽然 type
和 interface
在很多场景下可以互换使用,但它们在某些特定场景下有着各自的优势。type
更适用于组合不同类型,如联合类型、交叉类型等,而 interface
更适用于定义对象的形状,特别是在面向对象编程中。class
则提供了完整的类型定义和实现,可以在运行时进行实例化和操作。
在实践中,我们应该根据实际需求和场景选择合适的类型声明方式。例如,在定义一个复杂的对象类型时,可以使用 interface
;在组合不同类型时,可以使用 type
;在创建具有行为的对象时,可以使用 class
。