标签联合
我们可以把单例类型、联合类型、类型保护和类型别名这几种类型进行合并,来创建一个叫做可辨识联合的高级类型,它也可称作标签联合或代数数据类型。
可辨识联合要求具有两个要素:
- 具有普通的单例类型属性(这个要作为辨识的特征,也是重要因素)。
- 一个类型别名,包含了那些类型的联合(即把几个类型封装为联合类型,并起一个别名
interface Square { kind: "square"; // 这个就是具有辨识性的属性 size: number; } interface Rectangle { kind: "rectangle"; // 这个就是具有辨识性的属性 height: number; width: number; } interface Circle { kind: "circle"; // 这个就是具有辨识性的属性 radius: number; } type Shape = Square | Rectangle | Circle; // 这里使用三个接口组成一个联合类型,并赋给一个别名Shape,组成了一个可辨识联合。 function getArea(s: Shape) { switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; case "circle": return Math.PI * s.radius ** 2; } }
上面这个例子中,我们的 Shape 即可辨识联合,它是三个接口的联合,而这三个接口都有一个 kind 属性,且每个接口的 kind 属性值都不相同,能够起到标识作用。
越努力越幸运