Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript “未知”和“无效”之间的区别`_Typescript_Typescript3.0 - Fatal编程技术网

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
      的另一个“奇怪”行为是在中实现的,它使它们在函数参数中成为可选的,但在和中出现了错误。有关更多信息,请参阅