2017-06-21 73 views
1

正如您所知,JavaScript中的函数可以具有任何对象的属性。例如(取自优秀的JavaScript:权威指南,第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; 
} 

但编译器告诉我Type '(n: number) => number' is not assignable to type 'Factorial'. Index signature is missing in type '(n: number) => number'。 我不能做明显的事情,只是在函数内部定义private index: number;,我很难过。

回答

1

你有什么是hybrid types的例子。你必须使用类型断言,以确保功能符合接口:

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; 
+0

认为有一个更好的方法,但我想这就是它。它有诀窍。谢谢 –