为什么Typescript无法处理具有相同签名的函数重载?

时间:2018-10-28 03:47:15

标签: typescript

仅返回类型不同的重载函数将非常有用。调用的推断返回类型将是所有重载的返回类型的并集。

例如:

interface A {
  fn(): string
}
interface B {
  fn(): number
}

declare let x: A & B;
x.fn() // returns number | string in my dreams
       // returns number in reality

interface C {
  fn(): string
}
interface D extends C { // error - D incorrectly extends C
                        // wish this was okay
  fn(): number
}

declare let y: D
y.fn() // would return number | string

Typescript为什么要做出这个决定?

背景

我正在编写类型安全的SQL查询构建器。

开始时,根查询构建器将为Select & Update & Insert & Delete类型,以便它可以访问所有查询类型的方法。

方法具有一组可能的输出类型。例如,where()的范围是{选择,更新,删除},update()的范围是{更新}。

给出基本类型和方法调用,结果类型是基本类型与方法范围的交集的联合。

因此,如果您在根查询构建器上调用where(),则新的查询构建器类型为:

(Select & Update & Insert & Delete) | (Select & Update & Delete)
  = (Select & Update & Delete)`

如果您随后致电update(),则新的查询构建器类型为:

(Select & Update & Delete) | (Update)
  = (Update)

不幸的是,这种设计纯粹是理论上的,因为Typescript无法正确解析具有相同签名的重载。

0 个答案:

没有答案