docs(function): modify never type

This commit is contained in:
ruanyf
2023-08-26 22:38:21 +08:00
parent 3dc90af3a0
commit 80afd4cf5c

View File

@@ -546,7 +546,7 @@ function f():void {
}
```
需要特别注意的是,如果变量、对象方法、函数参数的类型是 void 类型的函数,那么并不代表不能赋值为有返回值的函数。恰恰相反,该变量、对象方法和函数参数可以接受返回任意值的函数,这时并不会报错。
需要特别注意的是,如果变量、对象方法、函数参数是一个返回值为 void 类型的函数,那么并不代表不能赋值为有返回值的函数。恰恰相反,该变量、对象方法和函数参数可以接受返回任意值的函数,这时并不会报错。
```typescript
type voidFunc = () => void;
@@ -556,7 +556,7 @@ const f:voidFunc = () => {
};
```
上面示例中,变量`f`的类型是`voidFunc`,是一个没有返回值的函数类型。但是实际上,`f`的值是一个有返回值的函数(返回`123`),编译时不会报错。
上面示例中,变量`f`的类型是`voidFunc`,是一个没有返回值的函数。但是实际上,`f`的值可以是一个有返回值的函数(返回`123`),编译时不会报错。
这是因为,这时 TypeScript 认为,这里的 void 类型只是表示该函数的返回值没有利用价值,或者说不应该使用该函数的返回值。只要不用到这里的返回值,就不会报错。
@@ -601,6 +601,16 @@ const f3 = function ():void {
上面示例中,函数字面量声明了返回`void`类型,这时只要有返回值(除了`undefined``null`)就会报错。
函数的运行结果如果是抛错,也允许将返回值写成`void`
```typescript
function throwErr():void {
throw new Error('something wrong');
}
```
上面示例中,函数`throwErr()`会抛错,返回值类型写成`void`是允许的。
除了函数,其他变量声明为`void`类型没有多大意义,因为这时只能赋值为`undefined`或者`null`(假定没有打开`strictNullChecks`) 。
```typescript
@@ -636,6 +646,8 @@ function fail():Error {
上面示例中,函数`fail()`返回一个 Error 对象,所以返回值类型是 Error。
另外,由于抛错的情况属于`never`类型或`void`类型,所以无法从返回值类型中获知,抛出的是哪一种错误。
2无限执行的函数。
```typescript
@@ -684,6 +696,24 @@ function f(
上面示例中,函数`f()`的参数`x`的类型为`string|undefined`。但是,`x`类型为`undefined`时,调用了`neverReturns()`。这个函数不会返回,因此 TypeScript 可以推断出,判断语句后面的那个`x`,类型一定是`string`
一个函数如果某些条件下有正常返回值,另一些条件下抛错,这时它的返回值类型可以省略`never`
```typescript
function sometimesThrow():number {
if (Math.random() > 0.5) {
return 100;
}
throw new Error('Something went wrong');
}
const result = sometimesThrow();
```
上面示例中,函数`sometimesThrow()`的返回值其实是`number|never`,但是一般都写成`number`,包括最后一行的变量`result`的类型,也是被推断为`number`
原因是前面章节提到过,`never`是 TypeScript 的唯一一个底层类型,所有其他类型都包括了`never`。从集合论的角度看,`number|never`等同于`number`。这也提示我们,函数的返回值无论是什么类型,都可能包含了抛出错误的情况。
## 局部类型
函数内部允许声明其他类型,该类型只在函数内部有效,称为局部类型。