2013-02-11 10 views
35

なぜTypescriptは私が定義している関数がインターフェイスの宣言と一致しないと警告しますが、関数を呼び出せば警告します。 datatoUpper -Typescript関数のインターフェイス

interface IFormatter { 
    (data: string, toUpper : boolean): string; 
}; 

//Compiler does not flag error here. 
var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

upperCaseFormatter("test"); //but does flag an error here. 

答えて

53

インタフェースは、インタフェースを実装する関数のすべての呼び出し元が必要な引数を指定することを保証します。

TypeScriptは、使用されていない引数を渡すかどうかをJavaScriptが気にしないことを理解しているので、実装ではこれを賢明に許可します。

なぜこれは問題ありませんか?これは、呼び出しコードに影響を与えずに、インタフェースの実装を置き換えることができるためです。

例:IFormatterの代わりに使用でき、コードが機能します。コードが読みにくくなります - 活字体はこれをしなかった場合は

interface IFormatter { 
    (data: string, toUpper : bool): string; 
}; 

var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

var variableCaseFormatter: IFormatter = function (data: string, toUpper: bool) { 
    if (toUpper) { 
     return data.toUpperCase(); 
    } 

    return data.toLowerCase(); 
} 

// Switch between these at will 
//var formatter = upperCaseFormatter; 
var formatter = variableCaseFormatter; 

formatter("test", true); 

、あなたのupperCaseFormatterは、関数内のどこでも使用されなかったtoUpperと呼ばれるパラメータを持っている必要がありますする必要があります。

+0

しかし、 'upperCaseFormatter'を使用すると、冗長なブール値があります:' upperCaseFormatter( "test"、true); // 'true'を除外するとコンパイラの警告が出ます。だから代わりに、インターフェイスは間違っている必要があります: 'interface IFormatter {(data:string、toUpper?:bool):string; } 'しかし、これは関数宣言にもかかわらず' toUpper'を指定せずに 'variableCaseFormatter'(' test ');だけで 'variableCaseFormatter'を呼び出せることを意味します。私の現在の混乱のより簡単な例については私の質問を参照してください:http://stackoverflow.com/questions/23305020 – AJP

+5

@AJPあなたがきれいなコードを書いていたなら、あなたは可変ケースフォーマッタを書くことはありません。あなたはupperクラスのクラスとlowerクラスのクラスを書いて、厄介なブール引数を避けてください。 – Fenton

+0

@AJP 'upperCaseFormatter'を直接呼び出す場合、インタフェースは無関係です。 –

関連する問題