可辨识联合
大约 2 分钟TypescriptTypescript
提示
- strictNullChecks
- never类型
前言
把单例类型、联合类型、类型保护和类型别名这几种类型进行合并,来创建一个叫做可辨识联合的高级类型,它可以称作标签联合或代数数据类型
单例模型:符合单例模式的数据类型
可辨识联合类型要求具有两个元素:
- 具有普通的单例类型属性
- 一个类型别名,包含了那些类型的联合(即把几个类型封装为联合类型,并起一个别名)
strictNullChecks
具体用例:
interface Square {
kind: "square";
size: number;
}
interface Rectangle {
kind: "rectangle";
height: number;
width: number;
}
interface Circle {
kind: "circle";
radius: number;
}
interface Triangle {
kind: "triangle";
bottom: number;
height: number;
}
type Shape = Square | Rectangle | Circle | Triangle; // 这里我们在联合类型中新增了一个接口,但是下面的case却没有处理Triangle的情况
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;
}
}
** 运算符,两个 * 组成的运算符就是求幂运算符,2 ** 3 ==> 8
在 tsconfig.json
配置中把 strictNullChecks
设为 ture ,让函数的返回值类型为 number,当返回 undefined 时就会报错。
never类型
当函数返回一个错误或者不可能有返回值的时候,返回值类型为 never。具体用例如下:
function assertNever(value: never): never {
throw new Error("Unexpected object: " + value);
}
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;
default:
return assertNever(s); // error 类型“Triangle”的参数不能赋给类型“never”的参数
}
}
上面例子中,给default添加一个额外的函数,但是这种方式不仅能够在编译阶段提示我们遗漏了判断条件,而且在运行时也会报错。