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

该接口确保实现该接口的所有函数调用者都提供所需的参数 -datatoUpper.

因为 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 回答