为什么80%的码农都做不了架构师?>>>
今天买了本angularjs2揭秘,看到typescript有一个这个类型,其中有一段文字,说是never类型赋给never类型不报错,举例子,竟然看不懂,百度了下,才明白,贴出来
y=(()=>{throw new Error('ddd')})()
never 类型
TypeScript 2.0 引入了新的原始类型 never. never 类型代表从来不会出现的值的类型. 特别的, never 可以是永远不返回的函数的返回值类型, 也可以是变量在类型收窄中不可能为真的类型.
never 类型有以下特征:
- never 是任何类型的子类型, 并且可以赋值给任何类型.
- 没有类型是 never 的子类型或者可以复制给 never (除了 never 本身).
- 在一个没有返回值标注的函数表达式或箭头函数中, 如果函数没有 return 语句, 或者仅有表达式类型为 never 的 return 语句, 并且函数的终止点无法被执行到 (按照控制流分析), 则推导出的函数返回值类型是 never.
- 在一个明确指定了 never 返回值类型的函数中, 所有 return 语句 (如果有) 表达式的值必须为 never 类型, 且函数不应能执行到终止点.
由于 never 是所有类型的子类型, 在联合类型中它始终被省略, 并且只要函数有其他返回的类型, 推导出的函数返回值类型中就会忽略它.
一些返回 never 的函数的例子:
// 返回 never 的函数必须有无法被执行到的终止点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值是 never
function fail() {
return error("一些东西失败了");
}
// 返回 never 的函数必须有无法被执行到的终止点
function infiniteLoop(): never {
while (true) {
}
}
一些使用返回 never 的函数的例子:
// 推断的返回值类型为 number
function move1(direction: "up" | "down") {
switch (direction) {
case "up":
return 1;
case "down":
return -1;
}
return error("永远不应该到这里");
}
// 推断的返回值类型为 number
function move2(direction: "up" | "down") {
return direction === "up" ? 1 :
direction === "down" ? -1 :
error("永远不应该到这里");
}
// 推断的返回值类型为 T
function check(x: T | undefined) {
return x || error("未定义的值");
}
因为 never 可以赋值给任何类型, 返回 never 的函数可以在回调需要返回一个具体类型的时候被使用:
function test(cb: () => string) {
let s = cb();
return s;
}
test(() => "hello");
test(() => fail());
test(() => { throw new Error(); })