TypeScript 中 interface 和 type 的区别及使用场景

阅读时长 6 分钟读完

在 TypeScript 中,interface 和 type 都是用来定义类型的关键字。虽然它们都可以用来定义对象、函数等类型,但是它们在使用场景和语法上还是有些区别的。

interface

interface 是 TypeScript 中用来描述对象类型的关键字。它可以定义对象的属性、方法等,也可以继承其他 interface。

定义 interface

interface 的语法如下:

上面的代码定义了一个名为 Person 的 interface,它包含了 name、age 和 sayHi 三个属性,其中 name 和 age 分别是 string 和 number 类型,sayHi 是一个没有参数和返回值的函数。

继承 interface

一个 interface 可以继承其他的 interface:

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

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

上面的代码定义了一个 Animal 和一个 Cat 的 interface,Cat 继承了 Animal,因此 Cat 中包含了 Animal 中的 type 和 eat 方法,同时还定义了 color 和 meow 两个属性。

使用 interface

使用 interface 定义对象类型时,可以将 interface 作为类型注解:

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

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

上面的代码中,greet 函数接收一个 Person 类型的参数,这个参数必须包含 name、age 和 sayHi 三个属性,否则 TypeScript 会报错。

type

type 是 TypeScript 中用来定义类型别名的关键字。它可以定义任意类型的别名,包括基本类型、对象类型、函数类型等。

定义 type

type 的语法如下:

上面的代码定义了三个 type,分别是 Age、Name 和 Person。Age 和 Name 分别是 number 和 string 的别名,Person 是一个对象类型,它包含了 name、age 和 sayHi 三个属性。

使用 type

使用 type 定义类型别名时,可以将它作为类型注解:

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

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

上面的代码中,greet 函数接收一个 Person 类型的参数,这个参数必须包含 name、age 和 sayHi 三个属性,否则 TypeScript 会报错。

type 和 interface 的区别

虽然 type 和 interface 都可以用来定义类型,但是它们在使用场景和语法上还是有些区别的。

  • interface 主要用于定义对象类型,而 type 可以定义任意类型的别名。
  • interface 可以继承其他的 interface,而 type 不支持继承。
  • interface 的语法比较简洁,而 type 的语法比较灵活,可以定义任意类型的别名。

使用场景

interface 和 type 都有各自的使用场景,下面列举一些常见的情况。

使用 interface

  • 定义对象类型时,使用 interface 更加直观,可以明确对象的属性、方法等。
  • 定义类时,可以使用 interface 来描述类实例的属性和方法。
  • 定义函数类型时,可以使用 interface 来描述函数的参数和返回值类型。

使用 type

  • 定义复杂的类型别名时,使用 type 更加灵活,可以定义任意类型的别名。
  • 使用泛型时,可以使用 type 来定义泛型别名,方便复用。
  • 使用联合类型和交叉类型时,可以使用 type 来定义类型别名。

示例代码

下面是一些使用 interface 和 type 定义类型的示例代码。

interface 示例

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

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

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

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

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

上面的代码中,定义了一个 Person 接口,表示一个人的基本信息。然后定义了一个 Student 类,它实现了 Person 接口,表示一个学生的信息。最后创建了一个 tom 实例,它是一个 Person 类型的对象,但是实际上它是一个 Student 类型的实例。

type 示例

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

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

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

上面的代码中,定义了三个 type,分别是 Age、Name 和 Person。然后定义了一个 createPerson 函数,它返回一个 Person 类型的对象,表示一个人的基本信息。最后创建了一个 tom 对象,它是一个 Person 类型的对象。

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

纠错
反馈