Function 使用函数属性定义函数的接口

Function 使用函数属性定义函数的接口,function,typescript,interface,properties,Function,Typescript,Interface,Properties,您可能知道,JavaScript中的函数可以具有与任何对象相同的属性。例如(摘自优秀的JavaScript:the Definitive Guide,第6版,第178页)使用函数作为记忆数组计算阶乘: function factorial(n: number): number { if (isFinite(n) && n > 0 && n == Math.round(n)) { if (!(n in factorial)) facto

您可能知道,JavaScript中的函数可以具有与任何对象相同的属性。例如(摘自优秀的JavaScript:the Definitive Guide,第6版,第178页)使用函数作为记忆数组计算阶乘:

function factorial(n: number): number {
  if (isFinite(n) && n > 0 && n == Math.round(n)) {
    if (!(n in factorial))
      factorial[n] = n * factorial(n - 1);
    return factorial[n];
  }
  else
    return NaN;
}
factorial[1] = 1;
我尝试定义以下接口:

interface Factorial {
  (n: number) : number;
  [ index: number ]: number;
}
let factorial = function (n: number): number {
    if (isFinite(n) && n > 0 && n == Math.round(n)) {
        if (!(n in factorial))
            factorial[n] = n * factorial(n - 1);
        return factorial[n];
    }
    else
        return NaN;
} as Factorial;

factorial[1] = 1;
但是编译器告诉我,
Type'(n:number)=>number'不能分配给类型'Factorial'。类型“(n:number)=>number”中缺少索引签名

我不能做显而易见的事情,只能定义
私有索引:number在函数内部,我被难住了。

您拥有的就是一个示例。您必须使用类型断言来确保函数符合接口:

interface Factorial {
  (n: number) : number;
  [ index: number ]: number;
}
let factorial = function (n: number): number {
    if (isFinite(n) && n > 0 && n == Math.round(n)) {
        if (!(n in factorial))
            factorial[n] = n * factorial(n - 1);
        return factorial[n];
    }
    else
        return NaN;
} as Factorial;

factorial[1] = 1;

我以为有更好的办法,但我想就是这样了。它成功了。谢谢