讲一下,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 中各有优势,合理使用可以提高代码的可读性和可维护性。

相关推荐
前端小张同学14 分钟前
前端Vue后端Nodejs 实现 pdf下载和预览,如何实现?
前端·javascript·node.js
独孤求败Ace16 分钟前
第59天:Web攻防-XSS跨站&反射型&存储型&DOM型&接受输出&JS执行&标签操作&SRC复盘
前端·xss
天空之枫18 分钟前
node-sass替换成Dart-sass(全是坑)
前端·css·sass
SecPulse19 分钟前
xss注入实验(xss-lab)
服务器·前端·人工智能·网络安全·智能路由器·github·xss
路遥努力吧21 分钟前
el-input 不可编辑,但是点击的时候出现弹窗/或其他操作面板,并且带可清除按钮
前端·vue.js·elementui
绝顶少年26 分钟前
确保刷新页面后用户登录状态不会失效,永久化存储用户登录信息
前端
初学者7.1 小时前
Webpack总结
前端·webpack·node.js
fridayCodeFly1 小时前
使用 request 的 axios 状态码分析
前端·servlet
祈澈菇凉1 小时前
解释什么是受控组件和非受控组件
前端·javascript·react.js
LamBoring1 小时前
基于DSL的全栈建站框架
前端