类型别名(type)和接口(interface)
类型别名(type)
在 TypeScript 中,类型别名用于给一个类型提供一个新的名称,可以通过 `type` 关键字来定义类型别名。
基本示例
type StringOrNumber = string | number;
let value: StringOrNumber;
value = "Hello"; // 合法
value = 42; // 合法
对象类型别名
type Person = {
name: string;
age: number;
};
const person: Person = {
name: "Alice",
age: 30,
};
函数类型别名
type Greet = (name: string) => string;
const greet: Greet = (name) => `Hello, ${name}!`;
联合类型和交叉类型
type A = { x: number };
type B = { y: number };
type C = A & B; // 交叉类型
const obj: C = { x: 1, y: 2 }; // 合法
接口(interface)
接口(interface)用于定义对象的结构和类型,它可以描述对象的属性和方法。以下是一个简单的接口示例:
interface Person {
name: string;
age: number;
greet(): void;
}
const user: Person = {
name: "Alice",
age: 30,
greet() {
console.log(`Hello, my name is ${this.name}`);
}
};
user.greet(); // 输出: Hello, my name is Alice
接口继承(extends)
两个接口之间有相同的属性或方法,可以 将公共的属性或方法抽离出来,通过继承来实现复用。
interface Point2D { x: number y: number } // 使用 继承 实现复用: interface Point3D extends Point2D { z: number } let p3: Point3D = { x: 1, y: 1, z: 0 }
接口的特点
- **可扩展性**:接口可以通过继承扩展其他接口。
- **可选属性**:可以使用 `?` 定义可选属性。
- **只读属性**:使用 `readonly` 定义只读属性。
示例:
interface Vehicle {
readonly brand: string;
model: string;
year: number;
start(): void;
}
interface Car extends Vehicle {
trunkSize: number;
}
const myCar: Car = {
brand: "Toyota",
model: "Camry",
year: 2020,
trunkSize: 15,
start() {
console.log("Car started");
}
};
类型别名与接口的区别
相同点:都可以给对象指定类型。
类型别名 (`type`) 和接口 (`interface`) 有一些重要区别:
1. 定义方式
类型别名:可以用于基本类型、联合类型、交叉类型等。
type Point = { x: number; y: number };
type ID = string | number;
接口:主要用于定义对象的结构。
interface Point { x: number; y: number; }
2. 扩展性
类型别名:不能被扩展,但可以通过交叉类型组合。
type A = { a: number };
type B = A & { b: number }; // 可以组合
接口:可以通过继承扩展。
interface A { a: number; }
interface B extends A { b: number; }
3. 合并声明
类型别名:不支持声明合并。
接口:支持同名接口的声明合并。
interface A { a: number; }
interface A { b: number; } // 合并为 { a: number; b: number; }
4、使用场景
类型别名:更灵活,适用于需要复杂类型或联合类型的场景。
接口:更适合用于定义对象和类的结构,尤其是在需要扩展的情况下。
总结:选择使用 `type` 还是 `interface` 取决于具体需求。如果需要灵活性和复杂类型,使用类型别名;如果需要定义对象结构并可能扩展,使用接口。

浙公网安备 33010602011771号