字面量就是源代码中一个
固定的值
例如数值字面量: 1, 2, 3, ... 例如字符串字面量: 'a', 'abc', ...
type MyNum = 1;
let value1: MyNum = 1;
let value2: MyNum = 2;
如上的代码在编译器当中 let value2: MyNum = 2;
是报错的,取值就必须是该字面量的值
具有共同的
可辨识特征
一个类型别名, 包含了具有共同的可辨识特征
的类型的联合
关于什么是共同的可辨识特征如下:
// 正方形
interface Square {
// 共同的可辨识特征
kind: "square";
size: number;
}
// 长方形
interface Rectangle {
// 共同的可辨识特征
kind: "rectangle";
width: number;
height: number;
}
// 圆圈
interface Circle {
// 共同的可辨识特征
kind: "circle";
radius: number;
}
假如我现在要求如上这三个图形的面积,实现代码分别如下:
// 正方形
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
如果实现的不完整在编译器当中是会进行报错的:
// 正方形
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;
}
}
实现完整就不会报错:
添加 default + never
如果实现的不完整在编译器当中是会进行报错的:
// 正方形
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)
}
}
实现完整就不会报错:
本期结束咱们下次再见👋~
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。