当前位置: 首页 > news >正文

TypeScript中extends与implements的区别

在 TypeScript 中,extends 和 implements 都是用于实现面向对象编程中继承和多态的重要关键字

extends(继承)

extends 用于类之间的继承,一个类可以继承另一个类的属性和方法。

基本用法

class Animal {name: string;constructor(name: string) {this.name = name;}move(distance: number = 0) {console.log(`${this.name} moved ${distance}m.`);}
}class Dog extends Animal {breed: string;constructor(name: string, breed: string) {super(name); // 必须调用父类的构造函数this.breed = breed;}bark() {console.log("Woof! Woof!");}// 重写父类方法move(distance: number = 5) {console.log("Running...");super.move(distance); // 调用父类方法}
}const dog = new Dog("Buddy", "Golden Retriever");
dog.move(10); // Running... Buddy moved 10m.
dog.bark();   // Woof! Woof!

继承的原理

  1. 原型链继承:子类的原型对象指向父类的实例

  2. 构造函数调用:必须调用 super() 来初始化父类

  3. 方法重写:子类可以重写父类方法,通过 super 调用父类实现

implements(实现接口)

implements 用于类实现接口,确保类满足接口定义的契约。

基本用法

interface Animal {name: string;move(distance: number): void;
}interface Pet {owner: string;play(): void;
}class Dog implements Animal, Pet {name: string;owner: string;breed: string;constructor(name: string, owner: string, breed: string) {this.name = name;this.owner = owner;this.breed = breed;}move(distance: number) {console.log(`${this.name} ran ${distance} meters`);}play() {console.log(`${this.name} is playing with ${this.owner}`);}bark() {console.log("Woof!");}
}

实现多个接口

interface Swimmer {swim(): void;
}interface Flyer {fly(): void;
}class Duck implements Swimmer, Flyer {swim() {console.log("Duck is swimming");}fly() {console.log("Duck is flying");}
}

主要区别

特性extendsimplements
用途类继承类类实现接口
继承实现继承具体实现只继承类型约束
多重继承不支持(单继承)支持(多接口实现)
构造函数必须调用 super()不需要调用 super()
方法实现自动继承父类实现必须自己实现所有方法

高级用法

接口继承接口

interface Animal {name: string;
}interface Mammal extends Animal {hasFur: boolean;
}interface Pet extends Mammal {owner: string;
}class Cat implements Pet {name: string;hasFur: boolean = true;owner: string;constructor(name: string, owner: string) {this.name = name;this.owner = owner;}
}

类实现泛型接口

interface Repository<T> {findById(id: number): T | undefined;save(entity: T): void;
}class UserRepository implements Repository<User> {private users: User[] = [];findById(id: number): User | undefined {return this.users.find(user => user.id === id);}save(user: User): void {this.users.push(user);}
}

混合使用 extends 和 implements

class Vehicle {start() {console.log("Vehicle started");}
}interface Electric {batteryLevel: number;charge(): void;
}class ElectricCar extends Vehicle implements Electric {batteryLevel: number = 100;charge() {this.batteryLevel = 100;console.log("Fully charged");}// 继承自 Vehicle// start() 方法已存在
}

实际应用场景

extends 适用场景

  • 需要代码复用和继承实现时

  • 建立 is-a 关系(Dog is an Animal)

  • 需要方法重写和扩展功能时

implements 适用场景

  • 需要强制实现特定契约时

  • 多态性设计,不同类实现相同接口

  • 依赖注入和测试时使用接口抽象

理解 extends 和 implements 的区别和原理,有助于在 TypeScript 中设计出更加清晰、可维护的面向对象代码结构。

http://www.dtcms.com/a/596592.html

相关文章:

  • 企业网站建设问卷专业网站建设 公司哪家好
  • 建一个网站需要什么条件可以免费观看电视电影
  • ArrowDL BT下载工具v4.2.1中文版安装教程(附详细步骤+下载方法)
  • 高德MCP服务接入
  • 立即执行函数(IIFE)
  • Scratch编程教程 | 从入门到实战创意编程
  • 如何在Keil5中在没有硬件支持的情况下使用Keil的模拟器(Simulator) + 调试窗口输出进行调试
  • YOLOv8改进实战:自研MSAM多尺度注意力机制,通道注意力全面升级,CBAM再进化!
  • 从一场年会看乐鑫科技的创新传承
  • 【系统架构设计师-2025下半年真题】综合知识-参考答案及详解(回忆版)
  • custed谁做的网站大连电商平台有哪些
  • 公司高端网站设计公司沈阳建设厅官方网站
  • 微信小程序必要要安装SSL证书吗?小程序SSL详解
  • PostgreSQL18新功能COPY命令变得更加用户友好
  • 医疗小程序05完善就诊人信息
  • idea AI编程 腾讯云代码助手 CodeBuddy插件安装和使用
  • 湖南益阳网站建设做地坪网站
  • 02-SQLite 为了防止多人同时乱写,把整个数据库文件“当一本账本加锁”
  • 盲盒抽赏小程序一番赏 + 无限赏拓展玩法分析:技术赋能与商业破局
  • 专业网站开发价格wordpress打开自定义很慢
  • 济南建站公司电话网页界面设计与制作邓文达
  • Mysql主从架构的搭建
  • MySQL数据库:表的增删改查 [CRUD](进阶)
  • AI+云计算互融共生,2025AI云产业发展大会即将举行
  • 基于YOLO的深度学习框架用于从胸部X射线图像检测肺炎
  • spring cloud微服务常用组件
  • 工业通信的“钢铁心脏”:耐达讯自动化Profibus光纤模块,为机械手臂提供持久动力
  • 【Kafka全攻略】Kafka从入门到实战:核心概念+实操配置+故障排查全攻略
  • 基于SpringBoot的新闻管理系统【协同过滤推荐算法+可视化统计】
  • 展示型网站方案C语言做网站需要创建窗口吗