欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解 TypeScript 的两种类型系统:标准类型与结构类型 - 双重视角解析

最编程 2024-02-19 09:35:04
...


静态类型系统的职责之一是确定两个静态类型是否兼容:


  • 实际参数的静态类型 U(例如,通过函数调用提供)


  • 对应形式参数的静态类型 T(指定为函数定义的一部分)


这通常意味着要检查 U 是否是 T 的子类型。这种检查的两种方法(大致)是:


  • 在标准类型中,如果两个静态类型具有相同的标识(“名称”) ,则它们是相等的。一种类型是另一种类型的子类型,它们的子类型关系是显式声明的。


具有标准类型的语言有 c++Javac#SwiftRust


  • 在结构类型系统中,如果两个静态类型具有相同的结构(如果它们的部分具有相同的名称和相同的类型) ,则它们是相等的。如果 U 包含 T 的所有部分(可能还包括其他部分) ,并且 U 的每个部分都包含 T 的相应部分的子类型,那么一种类型 U 就是另一种类型 T 的子类型。


具有结构类型的语言有 ocaml/reasonmlHaskellTypeScript


下面的代码在标准类型系统中产生类型错误(第 A 行) ,但在 Typescript 的结构类型系统中是合法的,因为类 A 和类 B 具有相同的结构:


class A {
  name = 'A';
}
class B {
  name = 'B';
}
const someVariable: A = new B(); // (A)


Typescript 的接口在结构上也能工作——它们不需要实现来匹配:


interface Point {
  x: number;
  y: number;
}
const point: Point = {x: 1, y: 2}; // OK


推荐阅读