1. ホーム
  2. interface

[解決済み] Typescript関数インターフェース

2023-06-25 15:56:01

質問

なぜ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.

どのように解決するのですか?

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

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

なぜこれがOKなのか?なぜなら、呼び出しコードに影響を与えることなく、インターフェースの任意の実装を代用できることを意味するからです。

例を挙げます。あなたはどちらかを代用することができます 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 という、関数内のどこにも使われていないパラメータを持たなければなりません。