Почему я не могу вызвать перегруженную функцию таким образом?

Возьмите этот пример перегрузки функции:

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
      /* ... */
}

В справочнике сказано:

Обратите внимание, что function pickCard(x): any piece не является частью списка перегрузок, поэтому он имеет только две перегрузки: одна, которая принимает объект, и другая, которая принимает число. Вызов pickCard с любыми другими типами параметров вызовет ошибку.

Поэтому я не могу позвонить pickCard("test");, Выдает ошибку.

Если pickCard(x) не является действительной сигнатурой функции, то почему мы должны ее писать? Какая польза от этого? Есть ли вариант использования, о котором я не думаю?

Проверьте пример детской площадки

1 ответ

Решение

Первые два - просто подписи, чтобы указать, какие есть разные варианты вызова функции.

Третье - это фактическое определение функции, и оно просто получает один аргумент и возвращает любой.
В ней вы реализуете реальную логику, проверяете, какие типы были получены функцией и возвращаете соответствующее значение в соответствии с переданными параметрами.

Например:

function a(str: string): string;
function a(num: number): number;
function a(value: any): any {
    if (typeof value === "string") {
        return (parseInt(value) * 2).toString();
    } else {
        return value * 2;
    }
}

a("3"); // should be "6"
a(3); // should be 6
a(true); // error

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

Вы также можете иметь различное количество свойств:

function b(a: number): number;
function b(a: number, b: number): number;
function b(...args: number[]): any {
    if (args.length == 1) {
        ...
    } else {
        ...
    }
}

Как правило, это сценарий, в котором вы будете использовать разные подписи, потому что для одинакового количества параметров разных типов вы можете просто:

function a(value: string | number): any {
    if (typeof value === "string") {
        return (parseInt(value) * 2).toString();
    } else {
        return value * 2;
    }
}
Другие вопросы по тегам