2017-06-21 12 views
1

JavaScriptの関数は、任意のオブジェクトとしてプロパティを持つことができます。例えば、(優れたJavaScriptから取ら:Definitive Guideの、第6編、P 178)は、メモ化配列としての機能を使って階乗を計算する:関数のプロパティを使用して関数のインターフェイスを定義する

interface Factorial { 
    (n: number) : number; 
    [ index: number ]: number; 
} 
:私は次のインタフェースを定義する試み

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; 

しかし、コンパイラは私にそれを教えている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

良い方法がありましたが、これはそれだと思います。それはトリックです。ありがとう –

関連する問題