web-dev-qa-db-ja.com

タイプスクリプト関数インターフェース

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.
52
MBeckius

インターフェイスは、インターフェイスを実装する関数のすべての呼び出し元が必要な引数-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というパラメーターが必要になるため、コードが読みにくくなります。

76
Fenton