具有联合类型的条件类型

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>

playground