具有联合类型的条件类型
Conditional types with union types
假设我有一个泛型类型声明
type P1<T> = Promise<T>;
然后类型 T1 = P1<string | number | (() => void)>;
按预期产生 Promise<string | number | (() => void)>
。
如果我想缩小类型以不接受函数,我会声明
type P2<T> = T extends Function ? never : Promise<T>;
然而,type T2 = P2<string | number | (() => void)>
突然产生 Promise<string> | Promise<number>
而不是我预期的 Promise<string | number>
。
我知道这是根据打字稿的specs。但是,有没有办法扩展 P2
来使这个 yield Promise<string | number>
然而 和 禁止 P2
用于函数类型?
我也试过使用“裸”类型参数[T]
type P3<T> = [T] extends Function ? never : Promise<T>;
这会产生 type T3 = P3<string | number | (() => void)>
至少 Promise<string | number | (() => void)>
但函数类型没有按预期删除。
有没有可能实现我想要实现的目标?
您可以使用
type P3<T> = Promise<Exclude<T, () => any>>
type Y = P3<(() => void) | number | string> // will be Promise<string | number>
假设我有一个泛型类型声明
type P1<T> = Promise<T>;
然后类型 T1 = P1<string | number | (() => void)>;
按预期产生 Promise<string | number | (() => void)>
。
如果我想缩小类型以不接受函数,我会声明
type P2<T> = T extends Function ? never : Promise<T>;
然而,type T2 = P2<string | number | (() => void)>
突然产生 Promise<string> | Promise<number>
而不是我预期的 Promise<string | number>
。
我知道这是根据打字稿的specs。但是,有没有办法扩展 P2
来使这个 yield Promise<string | number>
然而 和 禁止 P2
用于函数类型?
我也试过使用“裸”类型参数[T]
type P3<T> = [T] extends Function ? never : Promise<T>;
这会产生 type T3 = P3<string | number | (() => void)>
至少 Promise<string | number | (() => void)>
但函数类型没有按预期删除。
有没有可能实现我想要实现的目标?
您可以使用
type P3<T> = Promise<Exclude<T, () => any>>
type Y = P3<(() => void) | number | string> // will be Promise<string | number>