Typescript “未知”和“无效”之间的区别`
根据: 相反,使用Typescript “未知”和“无效”之间的区别`,typescript,typescript3.0,Typescript,Typescript3.0,根据: 相反,使用void意味着forEach承诺不使用返回值,因此可以通过返回任何值的回调调用它 根据 unknown是any的类型安全对应项。任何东西都可以分配给unknown,但是unknown除了自身和any之外不能分配给任何东西 尽管我这么想,但从这些描述中,我找不到这些类型之间的任何区别 我还注意到,与unknown不同,当void用作函数参数类型时,调用函数时可以忽略该参数,即使该参数未标记为可选: declare const x:(a:void)=>void x() 虽然这种
void
意味着forEach承诺不使用返回值,因此可以通过返回任何值的回调调用它
根据
unknown
是any
的类型安全对应项。任何东西都可以分配给unknown
,但是unknown
除了自身和any
之外不能分配给任何东西
尽管我这么想,但从这些描述中,我找不到这些类型之间的任何区别
我还注意到,与unknown
不同,当void
用作函数参数类型时,调用函数时可以忽略该参数,即使该参数未标记为可选:
declare const x:(a:void)=>void
x()
虽然这种行为在处理泛型代码时有时很有用,但它似乎很奇怪。如果
void
应该只在返回类型中使用,为什么它会有这种特殊的行为,与其他类型不同?在与Aluan Haddad进行了长时间的讨论后,我的理解如下:
const x: void = undefined;
(): void => undefined;
(): void => {};
unknown
是其他所有类型的超类型。在其他语言中,这主要是void
类型的含义-任何东西都可以分配给它,但它可以不使用任何东西
void
是一种特殊类型。在正常情况下,它只是未定义的超类型,没有其他类型,甚至不是null
这使我们能够执行以下任一操作:
const x: void = undefined;
(): void => undefined;
(): void => {};
但阻止我们执行以下任何操作:
const x: void = null;
const y: void = 5;
(): void => 5;
但与其他类型不同void
在输出位置(作为返回类型的一部分)使用时具有特殊行为:()=>T
是任何T
的()=>void
的子类型,其中包括未定义的,空的当然还有空的
这样可以执行以下操作:
const x: () => void = () => 5
void
存在并被使用的原因似乎更具历史性而非实际性,因为它在未知
之前就已经存在,并且它与类型系统的交互方式不同于所有其他类型(这也导致了一些奇怪的事情,比如Promise
不是Promise
的子类型)
在这些类型之间作出决定的常见方法似乎是:
- 它是我只调用副作用的函数的返回类型吗?使用
void
- 这是一种我打算以某种方式使用的类型(返回或不返回),但没有任何保证吗?使用
未知
简短的版本是,使用返回void的函数时,调用方必须忽略它
它不同于
unknown
,因为unknown
并没有明确的意思是“不要使用这个”,它只是意味着它可以是任何东西。是的,这在我看来是正确的。void
的另一个“奇怪”行为是在中实现的,它使它们在函数参数中成为可选的,但在和中出现了错误。有关更多信息,请参阅