typescript的never类型

为什么80%的码农都做不了架构师?>>>   hot3.png

  今天买了本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(); })

 

转载于:https://my.oschina.net/mifans/blog/849950

你可能感兴趣的:(typescript的never类型)