打字稿:基于函数返回类型的错误重载选择

时间:2018-06-30 19:04:13

标签: typescript

为什么以下代码是编译错误:

export interface Timer { }
declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): Timer;
declare function setInterval(handler: (...args: any[]) => void, timeout: number): number;

const timer: number = setInterval(() => console.log('hi'), 1000);

此外,当我更改declare function语句的顺序时,它将编译代码而没有任何错误。看起来编译器只接受第一个类型声明。

编辑:我无法提供到游乐场的链接,因为该URL在问题中的格式不正确,并且我无法使用任何URL缩短器!

1 个答案:

答案 0 :(得分:2)

问题在于,在解决函数签名时,Typescript通常不会考虑预期的调用站点返回类型。在您的情况下,仅查看setInterval(() => console.log('hi'), 1000);,编译器就可以说此调用可以解析为任何一个签名,因此它按声明顺序(如编译器规范中指定)选择第一个签名。一旦选择了重载,编译器就不会在以后发生错误时撤消决定。

对我来说,真正的问题似乎是,即使是我,setInterval(() => console.log('hi'), 1000);的查找也无法确定它将返回number还是Timer。没有区别,有两个参数返回数字的调用,有两个参数和版本为空的rest参数返回Timer

的版本调用