TypeScript 什么是可辨识联合类型

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或具有多个输入类型的用户界面,判别联合特别有用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程