`unknown`和`void`之间的区别

根据这个答案:

使用void代替意味着 forEach 承诺不使用返回值,因此可以使用返回任何值的回调调用它

根据TypeScript 3.0 发行说明

...unknownany. 任何东西都可以分配给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,其中包括undefinednull当然还有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

以上是`unknown`和`void`之间的区别的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>