TypeScript 什么是可辨识联合类型
在TypeScript中,可辨识联合类型也称为“标签联合类型”或“代数数据类型”。它是一种表示值可以是多个不同类型之一的类型,其中标签表示值的类型。在TypeScript中创建可辨识联合类型时,使用“|”运算符来组合一组类型。这里,“判别符”属性可以用来区分对象的不同形状。
可辨识联合类型可用于模拟一个值可以是多个不同类型之一的情况,每个类型具有不同的属性集。例如,您可以定义一个可辨识联合类型Shape,可以包含一个“Circle”或一个“Rectangle”,如下所示:
type Shape = Circle | Rectangle
interface Circle {
kind: "circle";
radius: number;
}
interface Rectangle {
kind: "rectangle";
width: number;
height: number;
}
Shape类型是Circle和Rectangle类型的联合体,意味着Shape类型的值可以是Circle或Rectangle中的任意一个。然后,您可以使用这个“Shape”类型来定义一个具有给定半径的圆或者具有给定宽度和高度的矩形:
let s1: Shape = { kind: "circle", radius: 10 };
let s2: Shape = { kind: "rectangle", width: 5, height: 10 };
这种属性被称为“判别属性”,因为它用于区分不同类型的带标签联合类型。在这个例子中,kind属性在Circle值上的取值是“circle”,在Rectangle值上的取值是“rectangle”。你可以使用类型检查器来确定Shape值的类型并提取其字段:
function getArea(s: Shape): number {
if (s.kind === "circle") {
return s.radius * s.radius * Math.PI;
} else {
return s.width * s.height;
}
}
类型保护(s.kind = “circle”)检查kind属性的值,并在检查成功时将s的类型缩小为Circle。这使得您可以在接下来的一行中访问s的半径属性。
您还可以使用switch语句对区分联合类型进行模式匹配判断:
function getArea(s: Shape): number {
switch (s.kind) {
case "circle":
return s.radius * s.radius * Math.PI;
case "rectangle":
return s.width * s.height;
}
}
有不同类型的判别联合类型可以在TypeScript中使用。
1. 基于类型的判别联合类型: 这种判别联合类型使用被结合的值的类型作为判别标志。
例如:
type Result<T> = { success: true, value: T }
| { success: false, error: string }
在这个例子中,’Result’类型是一个带有两个选项的区分联合类型:一个成功变量,其中包含一个’value’字段,和一个失败变量,其中包含一个’error’字段。区分字段是’success’字段,它是一个布尔值,表示结果是成功还是失败。
2.基于字符串的区分联合类型: 这个区分联合类型使用字符串字面量作为区分字段。
例如:
type Action =
| { type: "increment" }
| { type: "decrement" }
| { type: "reset", value: number }
在此示例中,“Action”类型是一个带有三个可选项的区分联合类型:一个“增加”操作,一个“减少”操作和一个“重置”操作。鉴别标记是“type”字段,它是一个字符串文字,表示操作的类型。
3. 基于数字的区分联合: 此区分联合使用数字文字作为鉴别标记。
例如:
type NumberBase = 2 | 8 | 10 | 16
type Number = { base: NumberBase, value: string }
在这个例子中,’NumberBase’类型是一个带有四个选择项的分离联合类型:base 2、base 8、base 10和base 16。’Number’类型是一个记录类型,包含一个’base’字段,该字段是一个’type’为’NumberBase’的值,并且包含一个’value’字段,该字段是表示给定基数中的数字的字符串。
4. 混合的分离联合类型: 这个分离联合类型使用了不同类型的组合作为辨识符。
例如:
type Tree<T> =
| { kind: "leaf", value: T }
| { kind: "node", left: Tree<T>, right: Tree<T> }
在这个例子中,’Tree’类型是一种带有两个可选项的判别联合类型:一个是包含一个’value’字段的’leaf’节点,另一个是包含’left’和’right’两个字段的’node’节点,这两个字段都是树。判别标识是’kind’字段,它是一个字符串字面量,指示节点的类型。
总的来说,判别联合是在TypeScript中以类型安全的方式定义复杂数据类型和数据结构的强大方式,并且可以用于建模多种不同类型的值和关系。当处理可能具有多个形状的数据时,如来自JSON API或具有多个输入类型的用户界面,判别联合特别有用。
极客教程