Почему я не могу вызвать перегруженную функцию таким образом?
Возьмите этот пример перегрузки функции:
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;
}
}