gpt4 book ai didi

typescript - 如何理解类型 any、unknown、{} 之间以及它们与其他类型之间的关系?

转载 作者:行者123 更新时间:2023-12-05 01:17:39 25 4
gpt4 key购买 nike

试图理解类型之间的关系我有这个代码

type CheckIfExtends<A, B> = A extends B ? true : false;

type T1 = CheckIfExtends<number, unknown>; //true
type T2 = CheckIfExtends<number, {}>; //true
type T3 = CheckIfExtends<number, any>; //true
type T4 = CheckIfExtends<() => void, unknown>; //true
type T5 = CheckIfExtends<() => void, {}>; //true
type T6 = CheckIfExtends<() => void, any>; //true
type T7 = CheckIfExtends<unknown, any>; //true
type T8 = CheckIfExtends<any, unknown>; //true
type T9 = CheckIfExtends<{}, unknown>; //true
type T10 = CheckIfExtends<{}, any>; //true
type T11 = CheckIfExtends<any, {}>; //boolean
type T12 = CheckIfExtends<unknown, {}>; //false

Link to playground

有人可以解释一下吗?有什么区别? any extends {}怎么可能和 any不延长 {}同时?如 any extends unknownunknown extends any那么这是否意味着它们非常平等? null之上是Typescript的新缺陷吗?和 undefinded JavaScript 的股权问题?

实际上,
type T = CheckIfExtends<any, number>; //boolean

最佳答案

区别本质上是这样的:

  • the any type故意不合理,因为它可以分配给任何其他类型,也可以从任何其他类型分配(除了 never ,这取决于您在哪里使用它)。不健全意味着类型的一些基本规则被破坏,例如 transitivitysubtyping .一般来说,如果A可分配给 B , 和 B可分配给 C ,然后 A可分配给 C .但是any打破这个。例如:string可分配给 any , 和 any可分配给 number ... 但是 string不可分配给 number .这种特殊的不健全非常有用,因为它允许我们从根本上“关闭”难以或不可能正确键入的代码部分中的类型检查。但是你需要非常仔细地考虑any作为一种类型;它更像是一种“非类型”。
  • the empty type, {} ,是一种可以在运行时被视为对象的类型(也就是说,您可以从中读取属性或方法而不会出现运行时错误),但它在编译时没有已知的属性。这并不意味着它没有属性;它只是意味着编译器不知道它们中的任何一个。这意味着只有 nullundefined不可分配给 {} ( null.fooundefined.foo 是运行时错误)。甚至像 string 这样的原始类型可以被视为在运行时具有属性和方法( "".length"".toUpperCase() 工作,甚至 "".foo 只返回 undefined )。当然,任何实际的对象类型也将分配给 {} .

    另一方面,{} type 不能分配给很多类型。如果我有类型 {} 的值尝试将其分配给类型为 {foo: string} 的变量,会出现编译错误,如 {}不知道包含 foo属性(property)。您可以分配 {}本身,或者更广泛的类型,如 unknown ,或到“取消类型”any .

    这使得 {}非常接近a top type ,这是所有其他类型都可以分配的类型。它本质上是带有 null 的顶级类型和 undefined从中删除。
  • the unknown type在 TypeScript 3.0 中引入,是真正的顶级类型; TypeScript 中的每个类型都可以分配给 unknown .偶nullundefined可分配给 unknown .

    另一方面,unknown只能分配给它自己和“un-type” any .甚至 {}类型不够宽,无法分配 unknown到它。从概念上讲,您应该能够分配 unknown到联合类型 {} | null | undefined ,但这是 intentionally not implemented保留 unknown作为“真正的”顶级类型。


  • 您的大部分 CheckIfExtends<A, B>结果可以由上述解释。异常(exception)是 T11 :
    type T11 = CheckIfExtends<any, {}>; //boolean

    您的 CheckIfExtends<A, B>类型定义是 distributive conditional type ,当 A 时它会做一些有趣的事情是联合类型,因为如果联合的部分满足两个分支,则它允许采用条件的两个分支。当 A 时它也做同样的分布是 any ,除非 Banyunknown (所以 T8 表现正常)。在 microsoft/TypeScript#27418 中对此有一些讨论。 .不管怎样, T11取两个分支,你会得到 true | false这是 boolean . (来自 microsoft/TypeScript#27418, unknown 位置的 A 没有分布,所以 T7T12 也表现正常)。

    好的,希望有帮助;祝你好运!

    关于typescript - 如何理解类型 any、unknown、{} 之间以及它们与其他类型之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59135229/

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