TypeScript 中 extends 与 implements 的区别

阅读时长 7 分钟读完

TypeScript 是一种基于 JavaScript 的强类型语言,它在 JavaScript 的基础上增加了类型检查和静态代码分析等功能,让 JavaScript 更加强大和可靠。在 TypeScript 中,extends 和 implements 是两个常用的关键字,它们的区别和用法是很多开发者容易混淆和误用的。

extends 和 implements 的基本概念

在 TypeScript 中,extends 用于子类继承父类,它可以继承父类的属性和方法,并且可以添加自己的属性和方法。implements 则是用于类实现接口,它能够强制实现接口中的所有方法和属性。

下面是一个 extends 和 implements 的例子:

-- -------------------- ---- -------
----- ------ -
  ------ ----- -------

  ----------------- ------- -
    --------- - -----
  -

  ------ -------------- ------ - -- -
    ------------------------- ----- ----------- ---------
  -
-

----- --- ------- ------ -
  ------ ------ -------

  ----------------- ------- ------ ------- -
    ------------
    ---------- - ------
  -

  ------ ------ -
    ------------------ --------
  -
-

--------- -------- -
  ------------ -------- -----
-

----- --- ---------- -------- -
  ------ ------------ ------- -
    ------------------ -----------
  -
-

在上面的例子中,Animal 是一个父类,它有一个公共属性 name 和一个公共方法 move。Dog 是 Animal 的子类,它有一个额外的属性 breed 和一个新的方法 bark。Cat 实现了一个 CanSpeak 接口,接口包含一个必须实现的方法 speak。接下来我们会对这些概念进行详细介绍。

extends 的用法

在 TypeScript 中,extends 主要有两个作用:

  1. 子类继承父类的属性和方法
  2. 子类可以添加自己的属性和方法

继承父类的属性和方法非常简单,只需要在子类中使用 super 关键字调用父类的构造函数即可:

-- -------------------- ---- -------
----- ------ -
  ------ ----- -------

  ----------------- ------- -
    --------- - -----
  -

  ------ -------------- ------ - -- -
    ------------------------- ----- ----------- ---------
  -
-

----- --- ------- ------ -
  ------ ------ -------

  ----------------- ------- ------ ------- -
    ------------
    ---------- - ------
  -
-

在上面的例子中,Dog 继承了 Animal 的属性和方法,使用 super 关键字调用了父类的构造函数。

除了继承父类的属性和方法,子类还可以添加自己的属性和方法,例如:

-- -------------------- ---- -------
----- ------ -
  ------ ----- -------

  ----------------- ------- -
    --------- - -----
  -

  ------ -------------- ------ - -- -
    ------------------------- ----- ----------- ---------
  -
-

----- --- ------- ------ -
  ------ ------ -------

  ----------------- ------- ------ ------- -
    ------------
    ---------- - ------
  -

  ------ ------ -
    ------------------ --------
  -
-

在上面的例子中,Dog 添加了一个新的方法 bark。

implements 的用法

在 TypeScript 中,implements 用于类实现接口,它可以强制实现接口中的所有方法和属性。

接口是一种规范,定义了一组属性和方法,类可以通过实现接口来满足这个规范。接口的语法和类非常相似,只是多了一个 interface 关键字,例如:

在上面的例子中,Person 是一个接口,包含了三个属性:name、age 和 sayHi。注意,接口中的属性和方法都没有实现,只是定义了一种规范。

接口的实现非常简单,只需要在类中实现接口中的所有属性和方法即可:

-- -------------------- ---- -------
--------- ------ -
  ----- -------
  ---- -------
  ------ -- -- -----
-

----- ------- ---------- ------ -
  ------ ----- -------
  ------ ---- -------

  ----------------- ------- ---- ------- -
    --------- - -----
    -------- - ----
  -

  ------ ------- -
    ---------------- --- ------------- ----------- ----- ------
  -
-

在上面的例子中,Student 实现了 Person 接口,实现了接口中的所有属性和方法。

需要注意的是,如果类实现了一个接口,就必须实现该接口中的所有属性和方法,否则编译时会报错。

extends 和 implements 的区别

既然 extends 和 implements 都可以实现属性和方法的继承,那么它们之间到底有什么区别呢?

主要有以下几个方面的区别:

  1. extends 可以继承类的属性和方法,而 implements 只能实现接口的属性和方法。
  2. extends 可以实现代码重用和扩展,而 implements 则可以强制实现一定的规范。

举一个例子,假设我们有一个动物园程序,里面有很多动物都有 name 和 move 方法。我们可以把它们抽象成一个 Animal 类,然后所有的动物都继承 Animal 类:

-- -------------------- ---- -------
----- ------ -
  ------ ----- -------

  ----------------- ------- -
    --------- - -----
  -

  ------ -------------- ------ - -- -
    ------------------------- ----- ----------- ---------
  -
-

----- --- ------- ------ --

----- --- ------- ------ --

在上面的例子中,Dog 和 Cat 都继承了 Animal 类的属性和方法,这样代码就可以重用了。

但是,假设我们还要规定每个动物都要实现一个 speak 方法,这个时候就可以使用 implements 了:

-- -------------------- ---- -------
--------- -------- -
  ------------ -------- -----
-

----- --- ------- ------ ---------- -------- -
  ------ ------------ ------- -
    ------------------ -----------
  -
-

----- --- ------- ------ ---------- -------- -
  ------ ------------ ------- -
    ------------------ -----------
  -
-

在上面的例子中,我们定义了一个 CanSpeak 接口,规定了一个 speak 方法,然后 Dog 和 Cat 都实现了这个接口,这样我们就可以规定每个动物都要实现一个 speak 方法了。

总结

在 TypeScript 中,extends 和 implements 都是非常重要的关键字,它们分别用于类的继承和接口的实现。

extends 可以实现代码的重用和扩展,而 implements 则可以强制实现一定的规范。

需要注意的是,在使用 implements 的时候,类必须实现接口中的所有属性和方法,否则会编译错误。所以,在实际开发中,应该根据实际场景来选择合适的关键字,避免出现错误和不必要的麻烦。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648e662c48841e9894cc12c3

纠错
反馈