特殊的函数返回值
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) { } }
<a name="Lv08q"></a>
## never 是类型保护机制下,永远不会被观察到( observed )的变量类型
在 TS 中, null 和 undefined 是任何类型的有效值,所以无法正确地检测它们是否被错误地使用。于是 TS 引入了 `--strictNullChecks` 这一种检查模式。<br />由于引入了 `--strictNullChecks` ,在这一模式下,null 和 undefined 能被检测到。所以 TS 需要一种新的底部类型( bottom type )。所以就引入了 never。<br />「never 是类型保护机制下,永远不会发生改变的变量类型」,这一说法看起来比较绕,因为这不符合我们日常的编程习惯,还是用代码来解释,我们看以下代码:
```typescript
// Compiled with --strictNullChecks
function fn(x: number | string) {
if (typeof x === 'number') {
// x: number 类型
} else if (typeof x === 'string') {
// x: string 类型
} else {
// x: never 类型
// --strictNullChecks 模式下,这里的代码将不会被执行,x 无法被观察
}
}
void
void 表示没有任何类型。
当一个函数没有返回值时,TS 会认为它的返回值是 void 类型。例如:
function foo(): void {
alert('foo');
}
当我们声明一个变量类型是 void 的时候,它仅可以被赋值为 null 和 undefined;
let unusable: void = undefined;
never 和 void 的区别
- void 可以被赋值为 null 和 undefined的类型。 never 则是一个不包含值的类型。
- 拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常。