通常我可以掌握打字稿语言的大部分功能,但有时函数重载仍然很有挑战性。
我无法理解为什么打字稿编译器不断对以下代码 (mcve( error TS2394: Overload signature is not compatible with function implementation
:
class Editor {
replace(
searchValue: { [Symbol.match](string: string): RegExpMatchArray; },
replaceValue: string,
): this;
replace(
searchValue: { [Symbol.match](string: string): RegExpMatchArray; },
replacer: (substring: string, ...args: any[]) => string,
): this {
return this;
}
}
唯一的区别在于第二个参数:string
或(substring: string, ...args: any[]) => string
。
为什么编译器不能将它们作为string | (substring: string, ...args: any[]) => string
一起修复?
最后一个签名是实现签名,必须与所有重载兼容。在这种情况下,Editor
只定义一个公共签名,具有string
和实现签名的公共签名是带有回调的签名。这可能不是您的意图,您可能希望两个签名都可用:
class Editor {
replace(
searchValue: { [Symbol.match](string: string): RegExpMatchArray; },
replaceValue: string,
): this;
replace(
searchValue: { [Symbol.match](string: string): RegExpMatchArray; },
replacer: (substring: string, ...args: any[]) => string,
): this
replace(
searchValue: { [Symbol.match](string: string): RegExpMatchArray; },
replacer: string | ((substring: string, ...args: any[]) => string),
): this {
return this;
}
}
至于为什么编译器不能只是将实现签名拼接在一起,重载与实现签名的差异可能会变得非常大(实现签名有时只是使用 any
做所有事情(,可能认为最好允许开发人员选择具有最小兼容性检查的实现签名,以防止意外错误。