假设我有一个泛型类型声明
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>
游乐场