TypeScript中extends关键字的使用场景及说明

 更新时间:2026年04月02日 09:51:15   作者:阿珊和她的猫  
本文介绍了TypeScript中extends关键字的应用,包括类继承、泛型约束和接口继承三种场景,类继承实现功能扩展和多态;泛型约束确保类型安全;接口继承增强接口功能,通过具体示例展示了extends在不同场景下的用法

在 TypeScript 中,extends 关键字是实现类继承和泛型约束的核心语法。它允许开发者通过继承扩展类的功能,或者通过约束泛型参数来增强代码的灵活性和安全性。

本文将详细介绍 extends 关键字在不同场景下的使用方法和实际案例。

一、类继承中的extends

(一)定义与作用

在 TypeScript 中,extends 关键字用于表示一个类继承自另一个类。子类可以继承父类的属性和方法,并可以添加新的属性和方法或覆盖父类的方法。

基础语法

class Parent {
  constructor(public name: string) {}

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

class Child extends Parent {
  constructor(name: string, public age: number) {
    super(name); // 调用父类的构造函数
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old`);
  }
}

在这个例子中,Child 类继承了 Parent 类。Child 类通过 super 调用了父类的构造函数,并添加了一个新的属性 age 和一个覆盖的 greet 方法。

(二)使用场景

扩展功能

通过继承,子类可以扩展父类的功能,同时保持代码的复用性。

class Animal {
  constructor(public name: string) {}

  makeSound() {
    console.log(`${this.name} makes a sound`);
  }
}

class Dog extends Animal {
  constructor(name: string) {
    super(name);
  }

  makeSound() {
    console.log(`${this.name} barks`);
  }
}

在这个例子中,Dog 类继承了 Animal 类,并覆盖了 makeSound 方法,以实现特定的行为。

实现多态

继承是实现多态的基础。通过继承,子类可以覆盖父类的方法,从而实现不同的行为。

class Shape {
  draw() {
    console.log("Drawing a shape");
  }
}

class Circle extends Shape {
  draw() {
    console.log("Drawing a circle");
  }
}

class Square extends Shape {
  draw() {
    console.log("Drawing a square");
  }
}

function drawShape(shape: Shape) {
  shape.draw();
}

const circle = new Circle();
const square = new Square();

drawShape(circle); // 输出: Drawing a circle
drawShape(square); // 输出: Drawing a square

在这个例子中,CircleSquare 类继承了 Shape 类,并覆盖了 draw 方法。drawShape 函数可以接受任何 Shape 类型的对象,并调用其 draw 方法,从而实现多态。

二、泛型约束中的extends

(一)定义与作用

在泛型中,extends 关键字用于约束泛型参数的类型。通过 extends,可以指定泛型参数必须是某个类型或其子类型的实例。

基础语法

function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

const obj = { a: 1, b: 'hello' };
const value = getProperty(obj, 'b'); // value 的类型是 'hello'

在这个例子中,泛型参数 K 被约束为 T 的键类型(keyof T)。这确保了 key 参数必须是 obj 的有效键。

(二)使用场景

约束泛型参数

通过 extends,可以确保泛型参数满足特定的条件,从而提高代码的安全性和可读性。

class Component<T extends HTMLElement> {
  constructor(public element: T) {}

  getInnerText(): string {
    return this.element.innerText;
  }
}

const divComponent = new Component(document.createElement('div'));
console.log(divComponent.getInnerText()); // 输出: 空字符串

在这个例子中,Component 类的泛型参数 T 被约束为 HTMLElement 或其子类型。这确保了 element 属性是一个有效的 DOM 元素。

实现高级类型模式

extends 可以用于实现更复杂的类型模式,如条件类型和映射类型。

type MyType<T extends string | number> = T extends string ? { value: T } : { value: number };

const strType: MyType<string> = { value: 'hello' };
const numType: MyType<number> = { value: 42 };

在这个例子中,MyType 是一个条件类型,根据泛型参数 T 的类型返回不同的结构。

三、接口继承中的extends

(一)定义与作用

在接口中,extends 关键字用于表示一个接口继承自另一个接口。子接口可以扩展父接口的属性和方法。

基础语法

interface Animal {
  name: string;
  makeSound(): void;
}

interface Dog extends Animal {
  bark(): void;
}

function getAnimalSound(animal: Animal) {
  animal.makeSound();
}

const myDog: Dog = {
  name: 'Buddy',
  makeSound() {
    console.log(`${this.name} makes a sound`);
  },
  bark() {
    console.log(`${this.name} barks`);
  }
};

getAnimalSound(myDog); // 输出: Buddy makes a sound

在这个例子中,Dog 接口继承了 Animal 接口,并添加了一个新的方法 bark

(二)使用场景

扩展接口功能

通过继承,接口可以扩展其他接口的功能,同时保持代码的复用性。

interface Shape {
  draw(): void;
}

interface Circle extends Shape {
  radius: number;
}

interface Square extends Shape {
  sideLength: number;
}

function drawShape(shape: Shape) {
  shape.draw();
}

const myCircle: Circle = {
  radius: 5,
  draw() {
    console.log(`Drawing a circle with radius ${this.radius}`);
  }
};

const mySquare: Square = {
  sideLength: 4,
  draw() {
    console.log(`Drawing a square with side length ${this.sideLength}`);
  }
};

drawShape(myCircle); // 输出: Drawing a circle with radius 5
drawShape(mySquare); // 输出: Drawing a square with side length 4

在这个例子中,CircleSquare 接口继承了 Shape 接口,并添加了特定的属性。

四、总结

extends 关键字在 TypeScript 中用于实现类继承、泛型约束和接口继承。通过 extends,可以扩展类和接口的功能,约束泛型参数的类型,从而提高代码的复用性、安全性和灵活性。

希望本文能够帮助你更好地理解和使用 extends 关键字,提升你的 TypeScript 开发能力。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JavaScript 继承详解 第一篇

    JavaScript 继承详解 第一篇

    几乎每个开发人员都有面向对象语言(比如C++、C#、Java)的开发经验。 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例。
    2009-08-08
  • JavaScript 继承详解及示例代码

    JavaScript 继承详解及示例代码

    本文主要介绍JavaScript 继承的知识,这里整理了详细的资料及简单示例代码,帮助大家学习参考,有兴趣的小伙伴可以参考下
    2016-09-09
  • 使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法

    使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法

    今天工作中遇到个小问题,情况如下,当我在后台页面中设置Checkbox的Enable的值为false时,我在前端页面中使用脚本(chk.disabled = false),无法改变disabled的值为false,下面看看小编是怎么解决此问题的,需要的朋友一起了解了解吧
    2015-09-09
  • js 将线性数据转为树形的示例代码

    js 将线性数据转为树形的示例代码

    这篇文章主要介绍了js 将线性数据转为树形的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 原生js实现二级联动菜单

    原生js实现二级联动菜单

    这篇文章主要为大家详细介绍了原生js实现二级联动菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • js实现C#的StringBuilder效果完整实例

    js实现C#的StringBuilder效果完整实例

    这篇文章主要介绍了js实现C#的StringBuilder效果,以完整实例形式分析总结了js实现C#的StringBuilder效果的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • 原生JS实现循环Nodelist Dom列表的4种方式示例

    原生JS实现循环Nodelist Dom列表的4种方式示例

    这篇文章主要介绍了原生JS实现循环Nodelist Dom列表的4种方式,结合具体实例形式分析了javascript循环遍历Nodelist Dom列表的常用操作技巧,需要的朋友可以参考下
    2018-02-02
  • 利用JavaScript实现新闻滚动效果(实例代码)

    利用JavaScript实现新闻滚动效果(实例代码)

    这篇文章主要是对利用JavaScript实现新闻滚动效果的两种方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • JavaScript中的console.log()函数详细介绍

    JavaScript中的console.log()函数详细介绍

    这篇文章主要介绍了JavaScript中的console.log()函数详细介绍,本文讲解了什么是console.log()、兼容没有调试控制台的浏览器、使用参数、使用其它日志级别等内容,需要的朋友可以参考下
    2014-12-12
  • livereload工具实现前端可视化开发【推荐】

    livereload工具实现前端可视化开发【推荐】

    本文将介绍一个工具--livereload。这是一款能根据你本地文件(html、css、js)的变化,自动跟踪刷新浏览器的实时刷新工具,有了这个工具,会大大减轻你刷新页面的工作量。下面跟着小编一起来看下吧
    2016-12-12

最新评论