如何在TypeScript中使用函数类型

时间:2017-04-24 21:14:00

标签: javascript typescript

我试图了解如何使用"功能类型"。

我们说我们有以下内容:

function calSum(val1: number, val2: number): number{
    return val1 * val2;
}
console.log(calSum(10,20)); //prints 200

现在让我们说:

let calc: (value1: number, value2: number) => number;

如果我执行以下操作:

calc(10,20);

我希望看到200,但是我得到以下错误:

Uncaught TypeError: calFuncType is not a function

我想了解为什么会这样,以及如何使用这种类型?

2 个答案:

答案 0 :(得分:5)

此:

let calc: (value1: number, value2: number) => number;

编译成:

let calc;

也就是说,您只声明了一个带有名称的变量,但您没有为其赋值。

这是为它分配值的方法:

let calc: (value1: number, value2: number) => number = function(val1: number, val2: number): number{
    return val1 * val2;
}

编译器可以推断出类型,所以这应该足够了:

let calc = function(val1: number, val2: number): number{
    return val1 * val2;
}

或者,使用箭头功能:

let calc = (val1: number, val2: number) => val1 * val2;

答案 1 :(得分:1)

在您的示例中,calSum是您的函数的具体实现,而calc是尚未分配给任何内容的变量,因此它是undefined。您已指定calc可以容纳的值的类型,但您实际上还没有给它一个值。

我认为您可能正在寻找的是如何为函数定义接口,然后实现该接口。例如:

interface CalcFunction {
  (value1: number, value2: number): number;
}

let multiply: CalcFunction = (a, b) => a * b;
let add: CalcFunction = (a, b) => a + b;

let product: number = multiply(3, 5);
let sum: number = add(3, 5);

console.log(product); // 15
console.log(sum); // 8

TypeScript会知道multiplyadd都需要两个number个参数并返回number,因为它们都明确实现了CalcFunction接口。

然后,例如,您可以这样做:

let calculate = (calc: CalcFunction, a: number, b: number): number => {
  return calc(a, b);
}