具有联合类型的条件类型

Posted

技术标签:

【中文标题】具有联合类型的条件类型【英文标题】:Conditional types with union types 【发布时间】:2021-06-04 03:20:00 【问题描述】:

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

type P1<T> = Promise<T>;

然后T1 = P1&lt;string | number | (() =&gt; void)&gt;; 类型按预期生成Promise&lt;string | number | (() =&gt; void)&gt;

如果我想缩小类型以不接受函数,我会声明

type P2<T> = T extends Function ? never : Promise<T>;

但是,type T2 = P2&lt;string | number | (() =&gt; void)&gt; 突然产生 Promise&lt;string&gt; | Promise&lt;number&gt; 而不是 Promise&lt;string | number&gt;,正如我所期望的那样。

我知道这是根据打字稿的specs。但是,有什么方法可以扩展 P2 以使这个收益 Promise&lt;string | number&gt; 仍然禁止 P2 用于函数类型?

我也尝试使用“裸”类型参数 [T]

type P3<T> = [T] extends Function ? never : Promise<T>;

这产生type T3 = P3&lt;string | number | (() =&gt; void)&gt; 至少与Promise&lt;string | number | (() =&gt; void)&gt; 一样,但函数类型并未按预期删除。

我想要达到的目标有可能吗?

【问题讨论】:

【参考方案1】:

你可以使用

type P3<T> = Promise<Exclude<T, () => any>>

type Y = P3<(() => void) | number | string> // will be Promise<string | number>

playground

【讨论】:

谢谢! Type P3 = Promise> 是否使任意函数更通用...

以上是关于具有联合类型的条件类型的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose + TypeScript:有条件地在模型上找到()文档抛出错误:联合类型有签名,但没有一个相互兼容

MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)

具有默认参数值的打字稿条件返回类型

条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型

条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型

条件绑定的初始化器必须具有 Optional 类型,即使它是 Optional 类型