为什么以下代码是编译错误:
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缩短器!
答案 0 :(得分:2)
问题在于,在解决函数签名时,Typescript通常不会考虑预期的调用站点返回类型。在您的情况下,仅查看setInterval(() => console.log('hi'), 1000);
,编译器就可以说此调用可以解析为任何一个签名,因此它按声明顺序(如编译器规范中指定)选择第一个签名。一旦选择了重载,编译器就不会在以后发生错误时撤消决定。
对我来说,真正的问题似乎是,即使是我,setInterval(() => console.log('hi'), 1000);
的查找也无法确定它将返回number
还是Timer
。没有区别,有两个参数返回数字的调用,有两个参数和版本为空的rest参数返回Timer