特殊的函数返回值

never

为 TypeScript 增加 never 类型: https://github.com/Microsoft/TypeScript/pull/8652

在上述的链接中,作者为 TypeScript 新增了 never 类型。其有两种具体场景:

  • 作为不会返回( return )的函数的返回值类型
  • never 是类型保护机制下,永远不会发生改变的变量类型

    作为不会返回( return )的函数的返回值类型

    以下是作者给出的示例代码,在以下场景中,函数的返回值是 never。 ```typescript // 返回never的函数 必须存在 无法达到( unreachable ) 的终点 function error(message: string): never { throw new Error(message); }

// 由类型推论得到返回值为 never function fail() { return error(“Something failed”); }

// 返回never的函数 必须存在 无法达到( unreachable ) 的终点 function infiniteLoop(): never { while (true) { } }

  1. <a name="Lv08q"></a>
  2. ## never 是类型保护机制下,永远不会被观察到( observed )的变量类型
  3. 在 TS 中, null 和 undefined 是任何类型的有效值,所以无法正确地检测它们是否被错误地使用。于是 TS 引入了 `--strictNullChecks` 这一种检查模式。<br />由于引入了 `--strictNullChecks` ,在这一模式下,null 和 undefined 能被检测到。所以 TS 需要一种新的底部类型( bottom type )。所以就引入了 never。<br />「never 是类型保护机制下,永远不会发生改变的变量类型」,这一说法看起来比较绕,因为这不符合我们日常的编程习惯,还是用代码来解释,我们看以下代码:
  4. ```typescript
  5. // Compiled with --strictNullChecks
  6. function fn(x: number | string) {
  7. if (typeof x === 'number') {
  8. // x: number 类型
  9. } else if (typeof x === 'string') {
  10. // x: string 类型
  11. } else {
  12. // x: never 类型
  13. // --strictNullChecks 模式下,这里的代码将不会被执行,x 无法被观察
  14. }
  15. }

void

void 表示没有任何类型。
当一个函数没有返回值时,TS 会认为它的返回值是 void 类型。例如:

function foo(): void {
    alert('foo');
}

当我们声明一个变量类型是 void 的时候,它仅可以被赋值为 null 和 undefined;

let unusable: void = undefined;

never 和 void 的区别

  • void 可以被赋值为 null 和 undefined的类型。 never 则是一个不包含值的类型。
  • 拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常。