我正在尝试构建一个函数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不是字符串的函数。
答案 0 :(得分:1)
正如@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);
}