Последняя подпись является подписью реализации и должна быть совместима с всеми перегрузками.В этом случае 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
для всего), вероятно, считалось, что лучше всего позволить разработчику выбирать сигнатуру реализации с минимальной проверкой совместимости для предотвращения случайных ошибок.