首页 > 解决方案 > 为泛型设置 OR 条件

问题描述

考虑类型

type Smth<T, U> = ...

现在我想检查Tis stringORU是否是原始的。


我可以单独检查条件

type AreSame<T, U, Y, N> = (<X>() => X extends T ? 1 : 2) extends (<X>() => X extends U ? 1 : 2) ? Y : N
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
type IfPrimitive<T, Y, N> = T extends string | number | boolean | symbol | bigint | null | undefined ? IfAny<T, N, Y> : N

type Smth1<T, U> = AreSame<T, string, true, false>
type Smth2<T, U> = IfPrimitive<U, true, false>

但是如何通过 加入他们or

标签: typescript

解决方案


只需将第二个条件放入第一个的虚假分支:

type AreSame<T, U, Y, N> = (<X>() => X extends T ? 1 : 2) extends (<X>() => X extends U ? 1 : 2) ? Y : N
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
type IfPrimitive<T, Y, N> = T extends string | number | boolean | symbol | bigint | null | undefined ? IfAny<T, N, Y> : N

type Smth<T, U> = AreSame<T, string, true, IfPrimitive<U, true, false>>

推荐阅读