gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:13:29 26 4
gpt4 key购买 nike

根据 this answer :

Using void instead means that forEach promises not to use the return value, so it can be called with a callback that returns any value


根据 TypeScript 3.0 release notes

... unknown is the type-safe counterpart of any. Anything is assignable to unknown, but unknown isn’t assignable to anything but itself and any ...


尽管我这么想,但从这些描述中我找不到这些类型之间的任何区别。
我也注意到,不像 unknown , 当 void用作函数参数的类型,调用函数时可以省略该参数,即使它没有标记为可选:
declare const x: (a: void) => void

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

最佳答案

经过与Aluan Haddad的长时间讨论,我的理解如下:unknown是所有其他类型的父类(super class)型。在其他语言中,这主要是 void type is - 任何东西都可以分配给它,但它可以一无所获。void是一种特殊类型。一般情况下,它只是一个undefined的父类(super class)型,没有其他类型,甚至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 .
  • 关于typescript - `unknown` 和 `void` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66190346/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com