前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TypeScript-字面量类型和TypeScript-可辨识联合、可辨识联合完整性检查

TypeScript-字面量类型和TypeScript-可辨识联合、可辨识联合完整性检查

原创
作者头像
杨不易呀
发布2023-09-29 16:44:26
2710
发布2023-09-29 16:44:26
举报
文章被收录于专栏:杨不易呀

字面量概述

字面量就是源代码中一个 固定的值 例如数值字面量: 1, 2, 3, ... 例如字符串字面量: 'a', 'abc', ...

  • 在 TS 中我们可以把字面量作为具体的类型来使用:
  • 当使用字面量作为具体类型时, 该类型的取值就必须是该字面量的值
代码语言:typescript
复制
type MyNum = 1;
let value1: MyNum = 1;
let value2: MyNum = 2;

如上的代码在编译器当中 let value2: MyNum = 2; 是报错的,取值就必须是该字面量的值

可辨识联合概述

具有共同的 可辨识特征 一个类型别名, 包含了具有共同的 可辨识特征 的类型的 联合

关于什么是共同的可辨识特征如下:

代码语言:typescript
复制
// 正方形
interface Square {
    // 共同的可辨识特征
    kind: "square";
    size: number;
}

// 长方形
interface Rectangle {
    // 共同的可辨识特征
    kind: "rectangle";
    width: number;
    height: number;
}

// 圆圈
interface Circle {
    // 共同的可辨识特征
    kind: "circle";
    radius: number;
}

假如我现在要求如上这三个图形的面积,实现代码分别如下:

代码语言:typescript
复制
// 正方形
interface Square {
    // 共同的可辨识特征
    kind: "square";
    size: number;
}

// 长方形
interface Rectangle {
    // 共同的可辨识特征
    kind: "rectangle";
    width: number;
    height: number;
}

// 圆圈
interface Circle {
    // 共同的可辨识特征
    kind: "circle";
    radius: number;
}

type Shape = (Square | Rectangle | Circle);

function area(s: Shape) {
    switch (s.kind) {
        case "square":
            return s.size * s.size;
        case "rectangle":
            return s.width * s.height;
        case "circle":
            // ** 是ES7中推出的幂运算符
            return Math.PI * s.radius ** 2;
    }
}

如上代码中的 Shape 就是一个 可辨识联合

  • 因为: 它的取值是一个 联合
  • 因为: 这个联合的每一个取值都有一个共同的 可辨识特征

可辨识联合完整性检查

在企业开发中, 如果想对可辨识联合的完整性进行检查, 主要有两种实现方式分别如下

方式一

给函数添加返回值 + 开启 strictNullChecks

如果实现的不完整在编译器当中是会进行报错的:

image-20211204205827858
image-20211204205827858
代码语言:typescript
复制
// 正方形
interface Square {
    // 共同的可辨识特征
    kind: "square";
    size: number;
}

// 长方形
interface Rectangle {
    // 共同的可辨识特征
    kind: "rectangle";
    width: number;
    height: number;
}

// 圆圈
interface Circle {
    // 共同的可辨识特征
    kind: "circle";
    radius: number;
}

type Shape = (Square | Rectangle | Circle);

function area(s: Shape): number {
    switch (s.kind) {
        case "square":
            return s.size * s.size;
        // case "rectangle":
        //     return s.width * s.height;
        case "circle":
            return Math.PI * s.radius ** 2;
    }
}
image-20211204205842818
image-20211204205842818

实现完整就不会报错:

image-20211204210127120
image-20211204210127120

方式二

添加 default + never

如果实现的不完整在编译器当中是会进行报错的:

image-20211204210005497
image-20211204210005497
代码语言:typescript
复制
// 正方形
interface Square {
    // 共同的可辨识特征
    kind: "square";
    size: number;
}

// 长方形
interface Rectangle {
    // 共同的可辨识特征
    kind: "rectangle";
    width: number;
    height: number;
}

// 圆圈
interface Circle {
    // 共同的可辨识特征
    kind: "circle";
    radius: number;
}

type Shape = (Square | Rectangle | Circle);

function MyNever(x: never): never {
    throw new Error('可辨识联合处理不完整' + x);
}

function area(s: Shape): number {
    switch (s.kind) {
        case "square":
            return s.size * s.size;
        // case "rectangle":
        //     return s.width * s.height;
        case "circle":
            return Math.PI * s.radius ** 2;
        default:
            return MyNever(s)
    }
}

实现完整就不会报错:

image-20211204210053977
image-20211204210053977

最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字面量概述
  • 可辨识联合概述
  • 可辨识联合完整性检查
  • 方式一
  • 方式二
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档