TypeScript 中的类与接口详解

阅读时长 12 分钟读完

TypeScript 是一种由微软开发的 JavaScript 超集,它为 JavaScript 添加了静态类型、类、接口等特性。在前端开发中,TypeScript 已经被广泛应用于大型项目中,它可以提高代码的可维护性和可读性,减少错误和调试时间。本文将详细介绍 TypeScript 中的类与接口,包括类的定义、继承、访问修饰符、静态属性和方法,以及接口的定义、可选属性、只读属性、函数类型和类类型等。

类的定义

在 TypeScript 中,类的定义使用 class 关键字,类名的首字母通常大写。类中可以定义属性和方法,属性可以有默认值,方法可以有参数和返回值类型。下面是一个简单的类的示例:

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

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

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

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

在上面的示例中,Person 类有两个属性 nameage,它们分别表示人的姓名和年龄。Person 类还有一个构造函数 constructor,它接受两个参数 nameage,并将它们分别赋值给类的属性。Person 类还有一个方法 sayHello,它使用 console.log 打印出人的姓名和年龄。

类的继承

在 TypeScript 中,类可以使用 extends 关键字继承另一个类,从而获得父类的属性和方法。子类可以重写父类的方法,或者添加新的属性和方法。下面是一个类的继承示例:

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

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

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

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

在上面的示例中,Student 类继承了 Person 类,并添加了一个新的属性 grade,表示学生的年级。Student 类重写了 sayHello 方法,使用 console.log 打印出学生的姓名、年龄和年级。

访问修饰符

在 TypeScript 中,可以使用访问修饰符控制类的属性和方法的访问权限。访问修饰符包括 publicprivateprotected,分别表示公有、私有和受保护的属性和方法。默认情况下,类的属性和方法都是公有的。

  • public:公有属性和方法可以在类的内部和外部访问。
  • private:私有属性和方法只能在类的内部访问,子类和实例都无法访问。
  • protected:受保护的属性和方法可以在类的内部和子类中访问,但是实例无法访问。

下面是一个访问修饰符的示例:

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

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

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

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

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

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

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

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

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

在上面的示例中,Animal 类定义了三个属性 nameagegender,分别表示动物的名称、年龄和性别。Animal 类有一个公有方法 sayHello,使用 console.log 打印出动物的名称、年龄和性别。Animal 类还有一个私有方法 getAge,它返回动物的年龄。Animal 类还有一个受保护方法 getGender,它返回动物的性别。

Cat 类继承了 Animal 类,并重写了 sayHello 方法。Cat 类使用 console.log 打印出猫的名称和性别,使用 getGender 方法获取受保护的属性 gender。在实例化 AnimalCat 类的时候,可以分别访问公有属性和方法,但是无法访问私有和受保护的属性和方法。

静态属性和方法

在 TypeScript 中,可以使用 static 关键字定义静态属性和方法。静态属性和方法不需要实例化类就可以访问,可以通过类名直接访问。下面是一个静态属性和方法的示例:

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

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

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

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

在上面的示例中,MathUtils 类定义了一个静态属性 PI 和两个静态方法 addsub。静态属性和方法可以通过类名直接访问,不需要实例化类。在使用静态属性和方法的时候,可以省略 new 关键字。

接口的定义

在 TypeScript 中,接口用来描述对象的形状,它可以定义对象的属性、方法和索引类型。接口可以用来限制函数的参数和返回值类型,也可以用来限制类的实例属性和方法。下面是一个接口的示例:

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

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

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

在上面的示例中,Person 接口定义了三个属性 nameagesayHello,分别表示人的姓名、年龄和打招呼的方法。Person 接口限制了对象的形状,它可以用来限制函数的参数和返回值类型,也可以用来限制类的实例属性和方法。在实例化对象的时候,需要满足接口的要求。

可选属性和只读属性

在 TypeScript 中,可以使用 ? 修饰符定义可选属性,表示这个属性可以不存在。还可以使用 readonly 关键字定义只读属性,表示这个属性只能在初始化的时候赋值,之后不能修改。下面是一个可选属性和只读属性的示例:

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

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

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

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

在上面的示例中,Animal 接口定义了四个属性 nameagegendertype,分别表示动物的名称、年龄、性别和类型。gender 属性使用 ? 修饰符定义为可选属性,表示这个属性可以不存在。type 属性使用 readonly 关键字定义为只读属性,表示这个属性只能在初始化的时候赋值,之后不能修改。在实例化 Animal 对象的时候,可以省略可选属性,但是不能修改只读属性。

函数类型和类类型

在 TypeScript 中,可以使用接口描述函数的类型和类的类型。函数类型的接口定义了函数的参数和返回值类型,类类型的接口定义了类的构造函数和实例方法。下面是一个函数类型和类类型的示例:

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

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

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

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

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

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

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

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

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

在上面的示例中,AddFunc 接口定义了一个函数类型,它接受两个参数 ab,返回一个数字。add 函数满足 AddFunc 接口的要求,可以使用 add 函数进行加法运算。

Animal 接口定义了一个类的类型,它有三个属性 nameagesayHello,分别表示动物的名称、年龄和打招呼的方法。AnimalConstructor 接口定义了一个类的构造函数类型,它接受两个参数 nameage,返回一个 Animal 类型的对象。Cat 类实现了 Animal 接口,它有两个属性 nameage,和一个实例方法 sayHello。在实例化 AnimalClass 对象的时候,使用 Cat 类作为参数,返回一个 Animal 类型的对象。在实例化 animal 对象的时候,使用 AnimalClass 类作为构造函数,返回一个 Cat 类型的对象,然后可以调用 sayHello 方法。

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

纠错
反馈