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;
  }
}

总结

虽然 typeinterface 在很多场景下可以互换使用,但它们在某些特定场景下有着各自的优势。type 更适用于组合不同类型,如联合类型、交叉类型等,而 interface 更适用于定义对象的形状,特别是在面向对象编程中。class 则提供了完整的类型定义和实现,可以在运行时进行实例化和操作。

在实践中,我们应该根据实际需求和场景选择合适的类型声明方式。例如,在定义一个复杂的对象类型时,可以使用 interface;在组合不同类型时,可以使用 type;在创建具有行为的对象时,可以使用 class

参考链接

typescript 官网

posted @ 2024-07-31 09:55  shellon  阅读(56)  评论(0编辑  收藏  举报