申明为 void 类型的变量,只能赋予 undefined 和 null。因此一个函数如果返回值是void类型,返回值只能是null或undefined


let unusable: void = undefined;

// OK
function fn(): void {
return null
}

// OK
function fn(): void {
}


never 类型表示永远不会有值的一种类型,从概念上就和void是不一样的。比如一个总是会抛出错误的函数,或者是一个从来不会有返回值的函数(函数的默认返回值undefined)。

// OK
let bar: never = (() => {
throw new Error('Throw my hands in the air like I just dont care');
})();

// ERROR
function fn(): never {
}


never 类型仅能被赋值给另外一个 never

// ERROR
let foo: never = 123


never使用示例

下面这个函数接收一个string或者number作为参数,返回一个boolean值。如果不是string或者number,则抛出异常。

function foo(x: string | number): boolean {
if (typeof x === 'string') {
return true;
} else if (typeof x === 'number') {
return false;
}

// 如果fail不是一个 never 类型,这会报错
// 但是由于 TypeScript 理解 `fail` 函数返回为 `never` 类型,它可以让你调用它。因为你可能会在运行时用它来做安全或者详细的检查
return fail('Unexhaustive');
}

function fail(message: string): never {
throw new Error(message);
}