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

相关推荐
Mh3 小时前
别再只会 `find` 了:Map 在前端业务里的真实用法
前端·javascript
陈随易3 小时前
FFmpeg 9.0 发布,代号 Lei,音视频处理再升级
前端·后端·程序员
爱丶狸4 小时前
Grafana_Zabbix_ImageRenderer_部署与前端操作手册
linux·前端·zabbix·grafana·kylin
用户059540174467 小时前
把AI对话记忆存储测试从手工改成Playwright+pytest,覆盖率从20%提到96%,回归时间缩短90%
前端·css
kyriewen7 小时前
别再这样写TypeScript了——Code Review中最常见的8个反模式
前端·javascript·typescript
名字还没想好☜7 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
午安~婉7 小时前
GitHub Token/ GitHub Stats统计显示图异常
前端·github·vercel·github token
码云之上8 小时前
AI Agent 工程化总览篇:从 Prompt 到 Harness
前端·人工智能
2501_926978338 小时前
以说明书 DNA 为模板——完整 AGI 的结构图景
前端·人工智能·经验分享·笔记·ai写作
IT_陈寒8 小时前
Vite静态资源引用这个坑我踩得有点疼
前端·人工智能·后端