函数上的Typescript调用签名作为参数

时间:2019-02-24 21:20:58

标签: typescript function call

我正在尝试构建一个函数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

好像const add2 = defaultArguments(add, { b: 9 })的ReturnType不是字符串的函数。

1 个答案:

答案 0 :(得分:1)

正如@jcalz在评论中指出的那样,方法defaultArguments返回functionstring

在编写代码的时候...

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);
}