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.
インターフェイスは、インターフェイスを実装する関数のすべての呼び出し元が必要な引数-data
およびtoUpper
を提供するようにします。
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);
TypeScriptがこれを行わなかった場合、upperCaseFormatter
には、関数内のどこでも使用されなかったtoUpper
というパラメーターが必要になるため、コードが読みにくくなります。