如何合并既有调用签名又有属性的类型,而不诉诸交集&?交叉点&创建的类型如Foo & { a: string } & { ()=>void } & Bar所示,可能难以理解和抽象.当我们想要的是{()=>void, a: string, b: string, c: number }时,它可以更容易解析.

type Merge<T1, T2> = {
  [k in keyof T1 | keyof T2]: k extends keyof T1 ? T1[k] : k extends keyof T2 ? T2[k] : never;
}

type Foo = {
    (a: string): number;
    (a: number): number;
    foo1: string
}

type Bar = {
    bar1: number
}

type FooBar = Merge<Foo, Bar> // Merge excluding the call signatures - how does one include the call signatures?
/* end type should be:
type FooBar = {
    (a: string): number;
    (a: number): number;
    foo1: string
    bar1: number
}
and not be an intersection `Foo & Bar`
*/

code

推荐答案

不,目前(TS4.7)没有办法在不使用intersection types的情况下通过编程实现这一点.

Mapped types不保留call signatures;在microsoft/TypeScript#29261处有一个功能请求,要求以某种方式实现这一点(从技术上讲,它要求construct signatures个,但this comment提到从类型中提取签名).

您可以通过创建交叉点,然后挑出结果的多个调用签名(即overloads)来实现这一点,但遗憾的是,没有好的编程方法来实现这一点,有关更多信息,请参阅this answer.即使你能做到这一点,你也可能不得不求助于十字路口来再次将它们结合起来.

现在,我要说的是,十字路口类型是你能做的最好的.

Typescript相关问答推荐

在TypScript中的同一数组中验证不同类型

为什么缩小封闭内部不适用于属性对象,但适用于声明的变量?

输入元素是类型变体的对象数组的正确方法是什么?'

来自类型脚本中可选对象的关联联合类型

无法从Chrome清除还原的初始状态数据

类型,其中一条记录为字符串,其他记录为指定的

接口中函数的条件参数

部分更新类型的类型相等

如何在Typescript 中组合unions ?

ANGLE订阅要么不更新价值,要么不识别价值变化

如果判断空值,则基本类型Gaurd不起作用

如何扩展RxJS?

在Google授权后由客户端接收令牌

在类型脚本中创建显式不安全的私有类成员访问函数

我可以将一个类型数组映射到TypeScrip中的另一个类型数组吗?

Select 类型的子项

Svelte+EsBuild+Deno-未捕获类型错误:无法读取未定义的属性(读取';$$';)

如何限定索引值必须与相应属性的id字段相同

显式推断对象为只读

Typescript 从泛型推断类型