gpt4 book ai didi

typescript - 如何有条件地检测 TypeScript 中的 `any` 类型?

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

这个问题在这里已经有了答案:





Typescript check for the 'any' type

(2 个回答)


2年前关闭。




我想要一个可以用作 IsStrictlyAny<T> 的实用程序它将解析为 true 类型如果 T正是 anyfalse否则键入。我怎样才能做到这一点?

我的第一个想法:

type IsStrictlyAny<T> = any extends T ? true : false;

结果:
  • IsStrictlyAny<any> : true (好!)
  • IsStrictlyAny<unknown> : true (不好!-我想要 false )
  • IsStrictlyAny<string> : boolean (不好!-我想要 false )
  • 最佳答案

    这是一个很好的问题,起初我认为这是不可能的,但经过一番调查,我认为有办法。

    首先,检查一下:

    type Test = any extends never ? 'A' : 'B' // "A" | "B"

    这意味着 typescript 知道 any可以是任何东西,因此它无法决定返回条件的哪一侧,因此它将双方作为联合返回。我有理由确定 any是唯一会以这种方式运行的情况。

    因此,您只需要尝试检测是否返回了联合或单个值。为此,我们使用了两种工具。

    首先,注意两个不兼容类型的交集是 never .
    type Test = 'A' & 'B' // never

    这是有道理的,因为一个值不能同时是两个不同的字符串。

    其次,如果我们可以得到类型联合的所有成员的交集,我们可以测试它是否是 never。 ,或者它是任何其他有效类型。 This answer有一个助手可以将联合转换为交叉点,所以我不会费心解释它。

    所以一些:
  • 检查 type 是否返回条件的两边作为联合
  • 将联合成员合并成一个交集,看看结果是不是never .

  • // From: https://stackoverflow.com/a/50375286/62076
    type UnionToIntersection<U> =
    (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never

    // If T is `any` a union of both side of the condition is returned.
    type UnionForAny<T> = T extends never ? 'A' : 'B'

    // Returns true if type is any, or false for any other type.
    type IsStrictlyAny<T> =
    UnionToIntersection<UnionForAny<T>> extends never ? true : false

    type A = IsStrictlyAny<any> // true
    type B = IsStrictlyAny<string> // false
    type C = IsStrictlyAny<unknown> // false

    Playground

    关于typescript - 如何有条件地检测 TypeScript 中的 `any` 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61624719/

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