Еще раз: перегрузка функции машинописи - PullRequest
0 голосов
/ 11 февраля 2019

Обычно я могу освоить большинство функций языка машинописи, но перегрузка функций иногда все еще довольно сложна.

Я не могу понять, почему компилятор машинописи продолжает выдавать error TS2394: Overload signature is not compatible with function implementation в следующем коде (mcve):

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

1 Ответ

0 голосов
/ 11 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...