81

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.
4

1 に答える 1

108

インターフェイスは、インターフェイスを実装する関数のすべての呼び出し元が必要な引数(dataおよび)を提供することを保証しますtoUpper

TypeScriptは、使用されていない引数を渡してもJavaScriptが気にしないことを理解しているため、実装でこれを巧みに許可します。

なぜこれは大丈夫ですか?これは、呼び出し元のコードに影響を与えることなく、インターフェイスの任意の実装を置き換えることができることを意味します。

IFormatter例:どちらかの実装に置き換えることができ、コードは機能します。

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

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

var variableCaseFormatter: IFormatter = function (data: string, toUpper: boolean) {
    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。これにより、コードが読みにくくなります。

于 2013-02-11T16:41:02.553 に答える