讲一下,ts中interface和type的继承怎么写的

在 TypeScript 中,interfacetype 都支持继承,但它们的使用场景和语法略有不同。以下是两者的继承方式及其区别。


1. interface 的继承

interface 是 TypeScript 中定义对象形状的主要方式,它支持通过 extends 关键字实现继承。

1.1 基本语法

typescript 复制代码
interface Animal {
  name: string;
  age: number;
}

interface Dog extends Animal {
  breed: string;
}

const dog: Dog = {
  name: "Buddy",
  age: 3,
  breed: "Golden Retriever",
};
  • Dog 继承了 Animal 的所有属性,并添加了新的属性 breed

1.2 多重继承

interface 支持多重继承,即一个接口可以继承多个接口。

typescript 复制代码
interface CanWalk {
  walk(): void;
}

interface CanBark {
  bark(): void;
}

interface Dog extends Animal, CanWalk, CanBark {
  breed: string;
}

const dog: Dog = {
  name: "Buddy",
  age: 3,
  breed: "Golden Retriever",
  walk() {
    console.log("Walking...");
  },
  bark() {
    console.log("Woof!");
  },
};
  • Dog 继承了 AnimalCanWalkCanBark 的所有属性和方法。

2. type 的继承

type 是 TypeScript 中定义类型别名的方式,它可以通过交叉类型(&)实现类似继承的效果。

2.1 基本语法

typescript 复制代码
type Animal = {
  name: string;
  age: number;
};

type Dog = Animal & {
  breed: string;
};

const dog: Dog = {
  name: "Buddy",
  age: 3,
  breed: "Golden Retriever",
};
  • Dog 通过交叉类型 & 继承了 Animal 的所有属性,并添加了新的属性 breed

2.2 多重继承

type 也可以通过交叉类型实现多重继承。

typescript 复制代码
type CanWalk = {
  walk(): void;
};

type CanBark = {
  bark(): void;
};

type Dog = Animal & CanWalk & CanBark & {
  breed: string;
};

const dog: Dog = {
  name: "Buddy",
  age: 3,
  breed: "Golden Retriever",
  walk() {
    console.log("Walking...");
  },
  bark() {
    console.log("Woof!");
  },
};
  • Dog 通过交叉类型 & 继承了 AnimalCanWalkCanBark 的所有属性和方法。

3. interfacetype 继承的区别

特性 interface type
语法 使用 extends 关键字 使用交叉类型 &
多重继承 支持多重继承 支持多重继承
扩展性 可以通过声明合并扩展 不能扩展,类型别名是静态的
适用场景 更适合定义对象的形状(如类、对象) 更适合定义复杂的类型(如联合类型、交叉类型)
可读性 更直观,适合面向对象编程 更灵活,适合函数式编程

4. 选择 interface 还是 type

  • 使用 interface 的场景

    • 定义对象的形状(如类、对象)。
    • 需要声明合并(例如扩展第三方库的类型)。
    • 需要更直观的面向对象编程风格。
  • 使用 type 的场景

    • 定义复杂的类型(如联合类型、交叉类型)。
    • 需要定义函数类型、元组类型等。
    • 需要更灵活的类型操作。

5. 示例对比

5.1 使用 interface

typescript 复制代码
interface Animal {
  name: string;
  age: number;
}

interface Dog extends Animal {
  breed: string;
}

const dog: Dog = {
  name: "Buddy",
  age: 3,
  breed: "Golden Retriever",
};

5.2 使用 type

typescript 复制代码
type Animal = {
  name: string;
  age: number;
};

type Dog = Animal & {
  breed: string;
};

const dog: Dog = {
  name: "Buddy",
  age: 3,
  breed: "Golden Retriever",
};

6. 总结

  • interface

    • 使用 extends 实现继承。
    • 支持声明合并,适合定义对象的形状。
    • 更适合面向对象编程。
  • type

    • 使用交叉类型 & 实现类似继承的效果。
    • 不支持声明合并,适合定义复杂类型。
    • 更适合函数式编程。

根据具体需求选择合适的工具,interfacetype 在 TypeScript 中各有优势,合理使用可以提高代码的可读性和可维护性。

相关推荐
默默地离开1 分钟前
从原生 JS 到 Vue,再到 React:前端框架演进与实战上手指南
前端·vue.js
用户26834842239592 分钟前
前端项目优雅引入自定义字体:使用 Fontsource 完全指南
前端
用户26834842239598 分钟前
Zustand + Axios 存储 Token 最佳实践
前端
一颗奇趣蛋9 分钟前
Vue 3 父子&爷孙组件通信
前端·vue.js
子洋18 分钟前
从零搭建一个免费稳定的私有短链接服务
前端·javascript·后端
GeGarron21 分钟前
AI N8N 技术文档
前端·aigc
站在风口的猪110823 分钟前
《前端面试题:CSS有哪些单位!》
前端·css·html·css3·html5
imkaifan25 分钟前
10、vue中路由的两种形式
前端·javascript·vue.js
1024小神28 分钟前
tauri2项目中自定义执行cmd命令界面卡死以及中文出错问题
前端·javascript