在 TypeScript 中,interface 和 type 都是用来定义类型的关键字。虽然它们都可以用来定义对象、函数等类型,但是它们在使用场景和语法上还是有些区别的。
interface
interface 是 TypeScript 中用来描述对象类型的关键字。它可以定义对象的属性、方法等,也可以继承其他 interface。
定义 interface
interface 的语法如下:
interface Person { name: string; age: number; sayHi(): void; }
上面的代码定义了一个名为 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 = number; type Name = string; type Person = { name: Name; age: Age; sayHi(): void; };
上面的代码定义了三个 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