TypeScript 面试题
目录

请解释 TypeScript 的结构化类型系统 (Structural Typing) 和标称类型系统 (Nominal Typing) 的区别

· 约 3 分钟读完 · 第 82 / 256 章

推荐答案

TypeScript 使用的是结构化类型系统(Structural Typing),这意味着类型兼容性是基于类型的结构(即成员和方法的形状)来判断的,而不是基于类型的名称或声明位置。换句话说,如果两个类型具有相同的结构,即使它们的名称不同,TypeScript 也会认为它们是兼容的。

相比之下,标称类型系统(Nominal Typing)则要求类型的名称或声明位置必须相同,才能被认为是兼容的。即使两个类型的结构完全相同,如果它们的名称不同,标称类型系统也会认为它们是不兼容的。

本题详细解读

结构化类型系统(Structural Typing)

在 TypeScript 中,结构化类型系统意味着类型兼容性是基于类型的结构来判断的。例如:

在这个例子中,Person 和 Employee 接口具有相同的结构,因此 TypeScript 认为它们是兼容的,允许将一个 Person 类型的变量赋值给 Employee 类型的变量。

标称类型系统(Nominal Typing)

标称类型系统则要求类型的名称或声明位置必须相同,才能被认为是兼容的。例如,在 C# 或 Java 中,即使两个类的结构完全相同,如果它们的名称不同,编译器也会认为它们是不兼容的。

在这个例子中,尽管 Person 和 Employee 类的结构完全相同,但由于它们的名称不同,C# 编译器会认为它们是不兼容的。

总结

  • 结构化类型系统:基于类型的结构来判断兼容性,TypeScript 使用这种系统。
  • 标称类型系统:基于类型的名称或声明位置来判断兼容性,C# 和 Java 使用这种系统。