一、基本概念
1、type(类型别名)
用来给一个类型起新名字,使用 type 创建类型别名。类型别名不仅可以用来表示基本类型,还可以用来表示对象类型、联合类型、元组和交集。
type userName = string; // 基本类型
type userMsg = string | number; // 联合类型
// 对象类型
type Person = {
name: userName;
age: number;
};
// 使用Person类型
let user: Person = {
name: "leo",
age: 18
};
2、interface(接口)
接口是命名数据结构(例如对象)的另一种方式;与 type 不同,interface 仅限于描述对象类型。接口的声明语法也不同于类型别名的声明语法。如将上面的类型别名 Person 重写为接口声明如下所示。
interface Person {
name: userName;
age: number;
}
在很多编程语言中,包括 TypeScript、Java 和 C# 等,都提供了 interface 和 type 这两个关键词用于定义自定义类型。它们有一些相似之处,但也存在一些重要的区别。
区别如下:
1. 语法和声明方式:在 TypeScript 中,interface 使用 `interface` 关键词声明,而 type 使用 `type` 关键词声明。
```typescript
interface Person {
name: string;
age: number;
}type Point = {
x: number;
y: number;
};
```
2. 对象类型 vs. 声明类型:interface 主要用于描述对象的形状和结构,通过定义属性名称和类型,但不能直接定义基本类型、联合类型和元组类型等非对象类型。而 type 可以用于定义任意类型,包括对象类型、基本类型、联合类型、交叉类型等。
```typescript
type Age = number;interface Person {
name: string;
age: Age; // 可以使用 type 定义的类型
}type Point = {
x: number;
y: number;
};type Coordinates = [number, number]; // 元组类型
```
3. 继承和实现:interface 支持继承其他 interface,并且一个类可以实现多个接口(多继承)。而 type 无法实现继承和多继承的特性。
```typescript
interface Animal {
eat(): void;
}interface Cat extends Animal {
meow(): void;
}class HouseCat implements Cat {
eat() {
console.log("Eating");
}meow() {
console.log("Meowing");
}
}
```
4. 可以扩展性:type 可以通过联合类型、交叉类型和映射类型等特性,更灵活地对现有类型进行组合或转换。而 interface 的定义通常较为简单,更注重对对象形状的描述和约束。
```typescript
type Person = {
name: string;
age: number;
};type Employee = Person & {
companyId: string;
};type Nullable<T> = T | null;
```
总的来说,interface 更适合用于定义对象的形状、刻画接口规范和类的实现,而 type 则更适合用于灵活地定义各种类型,并进行类型的组合、重命名和转换。在实际使用时,可以根据具体需求和语言特性选择合适的关键词来定义自定义类型。