根据这个答案 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
是所有其他类型的超类型。在其他语言中,这主要是void
type 是 - 任何东西都可以分配给它,但它不能用于任何用途。
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(使用前将#替换为@)