具有联合类型的条件类型



假设我有一个泛型类型声明

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>

我知道这是根据打字稿的说明。然而,是否有任何方法可以扩展P2以使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>

游乐场

最新更新