本文已参与「新人创作礼」活动,一起开启掘金创作之路。
never
- TypeScript never类型表示的是那些永不存在的值的类型,听起来不太好理解
- 任何类型都不能赋值给
never类型的变量,我们可以借助这点实现错误排查。 - 对于死循环的函数或执行时总会抛出异常的函数来说,函数对应的返回值类型也是 never 类型
- 因为
never类型为底部类型,所以任意类型与never交叉都得到never:type T1 = number & never; // never - 任意类型与
never类型联合,则不会影响原有的类型type T3 = number | never; // number type T4 = string | never; // string
//返回never的函数必须存在无法达到的终点
// 因为必定抛出异常,所以 error 将不会有返回值
function error(message: string): never {
throw new Error(message);
}
// 因为存在死循环,所以 loop 将不会有返回值
function loop(): never {
while (true) {
console.log("我是大帅哥")
}
}
//在编译阶段排查以外的错误
type Foo = string | number;
function controlFlowAnalysisWithNever(foo: Foo) {
if (typeof foo === "string") {
// 这里 foo 被收窄为 string 类型
} else if (typeof foo === "number") {
// 这里 foo 被收窄为 number 类型
} else {
// foo 在这里是 never
const check: never = foo;
}
}
never 和 void 之间的区别
没有显式返回值的函数会隐式返回
undefined。尽管我们通常说这样的函数 “什么也不返回”,但实际上它是会返回的。在这些情况下,我们通常忽略返回值。在 TypeScript 中这些函数的返回类型被推断为void具有
never返回类型的函数永不返回。它也不返回undefined。该函数没有正常完成,这意味着它可能会抛出异常或根本无法退出执行。
never类型为底部类型,也称为零类型或空类型。它通常表示为⊥,表示计算未将结果返回给调用方。void类型,在另一方面,是一个单元类型(类型,它允许只有一个值),没有定义的操作
Symbol
创建全局唯一引用;只支持number string类型参数
let sym1 = Symbol(1);
let sym2 = Symbol("1");
sym1==sym2 //false
sym1===sym2 //false
使用symbol定义的属性,是不能通过如下方式遍历拿到的
for in Object.keys() Object.getOwnPropertyNames()
只能通过一下方法拿到
Object.getOwnPropertySymbols() Reflect.ownkeys()基本上是万能的哪怕是设置为不可枚举也可以轻松拿到