Подпись вызова машинописного текста для функции в качестве аргумента - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь создать функцию defaultArguments, которая принимает существующую функцию и изменяет ее аргументы по умолчанию новыми входными данными.

var add = function (a: number, b: number) {
    return a + b;
};

var defaultArguments = function(
    // func: (args: ReturnType<typeof func.arguments>) => void, 
    func: Function,
    obj: Object) {
    let keys = Object.keys(obj);
    let alphabeth = "abcdefghijklmnopqrstuvwxyz";

    if (typeof func === "function") {
        for (let i: number = 0; i < func.arguments.length; i++) {
            for (let a = 0; a < keys.length; a++) {
                // Replace arguments according to alphabethic order
                let arr = [];
                arr.splice(alphabeth.indexOf(keys[a]), 0, keys[a]); // push value to position of letter in 'alphabeth'
                func.arguments[a] = arr[a];
            }
        }
        return func;

    } else { return "Cannot find function " + func['name'] };
};

const add2 = defaultArguments(add, { b: 9 });
console.assert(add2(10) === 19);
console.assert(add2(10, 7) === 17);
console.assert(isNaN(add2()));

При вызове второй команды console.assert(add2(10) === 19) выдается следующая ошибка:

Cannot invoke an expression whose type lacks a call signature. Type 'string | Function' has no compatible call signatures

Как будто тип ReturnType const add2 = defaultArguments(add, { b: 9 }) не являетсяфункция строки.

1 Ответ

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

Как указывает @jcalz в комментарии, метод defaultArguments возвращает либо function, либо string.

В тот момент, когда вы пишете код ...

console.assert(add2(10) === 19);

компилятор совершенно правильно отмечает ошибку, потому что в этот момент вы не знаете, какой из двух возможных типов add2 есть.

Если вы добавите дополнительную проверку типа в свой код,Компилятор будет уверен, что вы работаете со значением типа function, и скомпилируется без ошибки.

if (typeof(add2) === 'function')) {
  console.assert(add2(10) === 19);
  console.assert(add2(10, 7) === 17);
  console.assert(isNaN(add2()));
} else {
  console.error(add2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...