空值、未定义和不存在


# 空值、未定义和不存在

# 空值 void

在 TypeScript 中,可以用 void 表示没有任何返回值的函数:

function alertName(): void {
  alert('My name is Tom');
}
1
2
3

声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefinednull(只在 --strictNullChecks 未指定时):

let unusable: void = undefined;
1

在 TypeScript 中,所有的 void 在编译为 JavaScript 后输出都为 undefined

# 未定义 undefined

在 JavaScript 中,undefined 也是一个值,表示未经初始化的值,而 TypeScript 中的 void 表示不存在。

如果将上述代码函数的返回值类型由 void 改成 undefined,就会报错: A function whose declared type is neither 'void' nor 'any' must return a value.

此时应该加上一个 return,让函数最终会返回一个 undefined

function alertName(): undefined {
  alert('My name is Tom');
  return
}
1
2
3
4

除了含义上不同,在用法上也有区别。这次把 nullundefined 一起跟 void 作个比较:

undefinednull 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

// 这样不会报错
let num: number = undefined;
1
2
// 这样也不会报错
let u: undefined;
let num: number = u;
1
2
3

void 类型的变量不能赋值给 number 类型的变量:

let u: void;
let num: number = u;

// Type 'void' is not assignable to type 'number'.
1
2
3
4

# 不存在 never

never 表示永远不存在值,即一个函数不仅没有返回值(即返回值类型是 void),而且这个函数永远都不可能完整执行完成(执行到一半就异常结束或无限循环)。

一般用于错误处理函数:

function throwError(message: string, errorCode: number): never {
  throw {
    message,
    errorCode
  }
}

throwError('not found', 404);
1
2
3
4
5
6
7
8

同样永远执行不完的函数还有 while,它也可以用 never

function whileLoop(): never {
  while (true) {
    console.log(new Date().toLocaleString());
  }
}
1
2
3
4
5

在实际项目开发过程中,never 类型可以用来控制逻辑流程,但这个类型其实并不常用。

(完)