gpt4 book ai didi

typescript :检查类型是否为联合

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:41 27 4
gpt4 key购买 nike

是否可以检查给定类型是否为联合?

type IsUnion<T> = ???

为什么我需要这个:在我的代码中,我遇到的唯一情况是某些接收到的类型可以是联合。我用分布式条件类型处理它。但是,对于查看此代码的人来说,为什么首先使用 DCT 可能并不明显。所以我希望它像这样明确:IsUnion<T> extends true ? T extends Foo ...

我用 UnionToIntersection 做了几次尝试, 没有结果。我也想出了这个:

type IsUnion<T, U extends T = T> =
T extends any ?
(U extends T ? false : true)
: never

它给出 false对于非工会,但出于某种原因它给出了 boolean对于工会...我不知道为什么。我也试过infer U 来自 T,没有成功。

附言我的用例在某些人看来可能不完美/不正确/好,但无论如何标题中的问题已经出现,我想知道它是否可能(我觉得它是,但我自己很难弄清楚)。

最佳答案

看来我自己想出了答案!

这是类型(感谢 Titian Cernicova-Dragomir 对其进行了简化!):

type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true

type Foo = IsUnion<'abc' | 'def'> // true
type Bar = IsUnion<'abc'> // false

再一次UnionToIntersection jcalz 派上用场了!

原理是基于union A | B 不扩展交集 A & B

Playground

更新。我太傻了,没有把我的类型从这个问题发展成这个,这也很好用:

type IsUnion<T, U extends T = T> =
(T extends any ?
(U extends T ? false : true)
: never) extends false ? false : true

它将联合 T 分配给成分,还有 T 然后检查作为联合的 U 是否扩展了成分 T。如果是,那么它不是联合(但我仍然不知道为什么不添加 extends false ? false : true 就不起作用,即为什么前面的部分返回 boolean 用于工会)。

关于 typescript :检查类型是否为联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53953814/

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