仅返回类型不同的重载函数将非常有用。调用的推断返回类型将是所有重载的返回类型的并集。
例如:
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无法正确解析具有相同签名的重载。