“未知”和“无效”之间的区别

2024-02-28

根据这个答案 https://stackoverflow.com/a/58885486:

Using void相反意味着 forEach 承诺不使用返回值,因此可以使用返回任何值的回调来调用它

根据TypeScript 3.0 发行说明 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#new-unknown-top-type

... unknown是类型安全的对应物any。任何东西都可以分配给unknown, but unknown除了它本身之外不能分配给任何东西并且any ...

尽管我对此进行了思考,但从这些描述中我找不到这些类型之间的任何区别。

我还注意到,与unknown, when void用作函数参数的类型,调用函数时可以省略该参数,即使它没有标记为可选:

declare const x: (a: void) => void

x()

操场 https://www.typescriptlang.org/play?#code/CYUwxgNghgTiAEYD2A7AzgF3gDwFzwAop8A3JAS2AEp4BeAPnjMoCgXsCqWg

虽然这种行为有时在使用通用代码时很有用,但看起来很奇怪。如果void应该只在返回类型中使用,为什么它有这种特殊的行为,与其他类型不同?


经过与 Aluan Haddad 的长时间讨论,我的理解如下:

unknown是所有其他类型的超类型。在其他语言中,这主要是voidtype 是 - 任何东西都可以分配给它,但它不能用于任何用途。

void是一种特殊类型。正常情况下,它只是 undefined 的超类型,没有其他类型,甚至不是null.

这使我们能够执行以下任意操作:

const x: void = undefined;

(): void => undefined;

(): void => {};

但阻止我们做任何事情:

const x: void = null;

const y: void = 5;

(): void => 5;

但与其他类型不同。void如果在输出位置使用(作为返回类型的一部分),则具有特殊行为:() => T是一个子类型() => void对于任何T, 包括undefined, null而且当然void.

这使得可以执行以下操作:

const x: () => void = () => 5

的原因void存在和正在使用似乎更具历史意义而不是实际意义,因为它以前就已经存在过unknown并且它与类型系统的交互方式与所有其他类型不同(这也会导致一些奇怪的事情,比如Promise<number>不是的子类型Promise<void>).

在这些类型之间做出决定的常见方法似乎是:

  • 它是我只为副作用而调用的函数的返回类型吗?使用void.
  • 它是我打算以某种方式使用但没有保证的类型(返回或不返回)吗?使用unknown.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“未知”和“无效”之间的区别 的相关文章

随机推荐