метод перегрузки машинописного текста с функцией стрелки - PullRequest
0 голосов
/ 08 июня 2018

кто-нибудь знает, как использовать перегрузку метода для функции стрелки?

foo(args: string): string
    foo(args: number): number
    foo(args: string | number): string | number {
        if (typeof args === "string") {
            return "string"
        }
        return 1
    }

пробовал это, но не работает

foo: {
    (args: string): string;
    (args: number): number;
} = (args: string | number): string | number => {
    if (typeof args === "string") {
      return "string"
    }
    return 1
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Функции стрелок не поддерживают перегрузку.Из спецификации языка :

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

Когда вы пишете

foo: {
  (args: string): string;
  (args: number): number;
}

, вы не перегружаетесь.Вы на самом деле говорите, что foo - это функция, которая может принимать одну из этих форм (или, скорее, обе формы).Функция стрелки

(args: string | number): string | number =>

нарушает это ограничение, потому что это одна функция (не перегруженная), а string | number означает, что вы можете вернуть число, когда ожидается строка.

Какуже предложенное artem изменение типа возвращаемого значения на any или тип пересечения решает проблему.Но это не то же самое, что перегрузка, потому что компилятор не выбирает между сигнатурами.У вас есть только одно: функция стрелки.

0 голосов
/ 08 июня 2018

По причинам, которые я не до конца понимаю, ожидается, что тип возвращаемой реализации будет пересечением, а не объединением:

class B {
    foo: {
        (args: string): string;
        (args: number): number;
    } = (args: string | number): string & number => {
        if (typeof args === "string") {
            return "string" as string & number;
        }
        return 1 as string & number;
    }    
}

Так что это не лучше, чем просто объявить реализацию, возвращающую any, как это делается в примерах документации :

class B {
    foo: {
        (args: string): string;
        (args: number): number;
    } = (args: string | number): any => {
        if (typeof args === "string") {
            return "string";
        }
        return 1;
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...