什么是泛型与结构类型系统

330 阅读2分钟

泛型

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

数据结构的本质是什么?

主要包括三个部分:

  • 数据本身:
  • 数据的形状:例如二叉树中数据以分层的形式排布,每个元素最多由两个子元素。在链表中,数据以链式存储,顺序布局
  • 一组保留形状的操作:对链表进行添加,删除节点等操作之后,得到的依然是一个链表

两个专注点:

  • 一个是数据,包括数据的类型以及数据结构的实例中保存的实际值
  • 另一个是数据的形状和保留形状的操作。

泛型数据结构帮助我们解耦了这些关注点:泛型数据结构处理数据的布局、形状和任何保留形状的操作,它并不关心具体的数据内容,通过将数据布局的职责交付给独立于实际数据内容的泛型数据结构,可以让代码变得组件化。

泛型:泛型为类型提供变量, 一个没有泛型的数组可以容纳任何类型的数组,提供了泛型的数组描述特定类型变量

type StringArray = Array<string>;
type NumberArray = Array<number>;

Structural Type System

鸭子类型

要求两个对象满足“形状匹配(shape matching)”,而不关心两个对象的具体实现。

  • 如果传入的变量和声明的类型不匹配,TS就会进行兼容性检查
  • 原理是Duck-Check(一个对象,只要它会鸭子叫,那就当它是鸭子),就是说只要目标类型中声明的属性变量在源类型中都存在就是兼容的
const point3 = { x: 12, y: 26, z: 89 };
logPoint(point3); // logs "12, 26"
 
const rect = { x: 33, y: 3, width: 30, height: 80 };
logPoint(rect); // logs "33, 3"
 
const color = { hex: "#187ABF" };
logPoint(color);

另一个例子, {} 创建的字面量对象与类

class VirtualPoint {
  x: number;
  y: number;
 
  constructor(x: number, y: number) {
    this.x = x;
    this.y = y;
  }
}
 
const newVPoint = new VirtualPoint(13, 56);
logPoint(newVPoint); // logs "13, 56"