推荐答案
TypeScript 使用的是结构化类型系统(Structural Typing),这意味着类型兼容性是基于类型的结构(即成员和方法的形状)来判断的,而不是基于类型的名称或声明位置。换句话说,如果两个类型具有相同的结构,即使它们的名称不同,TypeScript 也会认为它们是兼容的。
相比之下,标称类型系统(Nominal Typing)则要求类型的名称或声明位置必须相同,才能被认为是兼容的。即使两个类型的结构完全相同,如果它们的名称不同,标称类型系统也会认为它们是不兼容的。
本题详细解读
结构化类型系统(Structural Typing)
在 TypeScript 中,结构化类型系统意味着类型兼容性是基于类型的结构来判断的。例如:
// www.javascriptcn.com code example
interface Person {
name: string;
age: number;
}
interface Employee {
name: string;
age: number;
}
let person: Person = { name: "Alice", age: 30 };
let employee: Employee = person; // 兼容,因为结构相同在这个例子中,Person 和 Employee 接口具有相同的结构,因此 TypeScript 认为它们是兼容的,允许将一个 Person 类型的变量赋值给 Employee 类型的变量。
标称类型系统(Nominal Typing)
标称类型系统则要求类型的名称或声明位置必须相同,才能被认为是兼容的。例如,在 C# 或 Java 中,即使两个类的结构完全相同,如果它们的名称不同,编译器也会认为它们是不兼容的。
// www.javascriptcn.com code example
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
class Employee {
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "Alice", Age = 30 };
Employee employee = person; // 不兼容,因为类型名称不同在这个例子中,尽管 Person 和 Employee 类的结构完全相同,但由于它们的名称不同,C# 编译器会认为它们是不兼容的。
总结
- 结构化类型系统:基于类型的结构来判断兼容性,TypeScript 使用这种系统。
- 标称类型系统:基于类型的名称或声明位置来判断兼容性,C# 和 Java 使用这种系统。