`unknown`和`void`之间的区别
根据这个答案:
使用
void代替意味着 forEach 承诺不使用返回值,因此可以使用返回任何值的回调调用它
根据TypeScript 3.0 发行说明
...
unknown是any. 任何东西都可以分配给unknown,但unknown不能分配给任何东西,但它本身和any......
尽管我这么想,但从这些描述中我找不到这些类型之间的任何区别。
我还注意到,与unknown, whenvoid用作函数参数的类型不同,调用函数时可以省略该参数,即使它没有标记为可选:
declare const x: (a: void) => void
x()
操场
虽然这种行为在处理通用代码时有时很有用,但它看起来很奇怪。ifvoid应该只在返回类型中使用,为什么它有这种特殊的行为,与其他类型不同?
回答
经过与Aluan Haddad的长时间讨论,我的理解如下:
unknown是所有其他类型的超类型。在其他语言中,这主要是void类型 - 任何东西都可以分配给它,但它可以无用。
void是一种特殊类型。通常情况下,它只是 undefined 的超类型,没有其他类型,甚至null.
这使我们能够执行以下任何操作:
const x: void = undefined;
(): void => undefined;
(): void => {};
但阻止我们执行以下任何操作:
const x: void = null;
const y: void = 5;
(): void => 5;
不过与其他类型不同。void如果在输出位置(作为返回类型的一部分)使用,则具有特殊行为:() => T是() => voidfor any的子类型T,其中包括undefined,null当然还有void。
这可以执行以下操作:
const x: () => void = () => 5
void存在和被使用的原因似乎比实际更具有历史意义,因为它之前已经存在unknown并且它与类型系统的交互与所有其他类型不同(这也会导致一些奇怪的事情,比如Promise<number>不是 的子类型Promise<void>) .
在这些类型之间做出决定的常用方法似乎是:
- 它是我只调用副作用的函数的返回类型吗?使用
void. - 它是一种我打算以某种方式使用但不能保证的类型(返回与否)?使用
unknown.
- Yeah, this looks right to me. The other "weird" behavior of `void` which makes them optional in function parameters was implemented in [microsoft/TypeScript#27522](https://github.com/microsoft/TypeScript/pull/27522) but there have been bugs raised at [microsoft/TypeScript#29131](https://github.com/microsoft/TypeScript/issues/29131) and [microsoft/TypeScript#39600](https://github.com/microsoft/TypeScript/issues/39600). See [this question](https://stackoverflow.com/questions/63349111/typescript-void-union-type) for more info