类型别名(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` 取决于具体需求。如果需要灵活性和复杂类型,使用类型别名;如果需要定义对象结构并可能扩展,使用接口。

posted @ 2024-09-26 23:54  李小菜丶  阅读(28)  评论(0)    收藏  举报