具有联合类型的条件类型
Posted
技术标签:
【中文标题】具有联合类型的条件类型【英文标题】:Conditional types with union types 【发布时间】:2021-06-04 03:20:00 【问题描述】:假设我有一个泛型类型声明
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
以使这个收益 Promise<string | number>
仍然和禁止 P2
用于函数类型?
我也尝试使用“裸”类型参数 [T]
type P3<T> = [T] extends Function ? never : Promise<T>;
这产生type T3 = P3<string | number | (() => void)>
至少与Promise<string | number | (() => void)>
一样,但函数类型并未按预期删除。
我想要达到的目标有可能吗?
【问题讨论】:
【参考方案1】:你可以使用
type P3<T> = Promise<Exclude<T, () => any>>
type Y = P3<(() => void) | number | string> // will be Promise<string | number>
playground
【讨论】:
谢谢! Type P3以上是关于具有联合类型的条件类型的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose + TypeScript:有条件地在模型上找到()文档抛出错误:联合类型有签名,但没有一个相互兼容
MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)
条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型