打字稿功能界面


72

为什么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.

Answers:


96

该接口确保实现该接口的所有函数调用者都提供所需的参数-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在函数中任何地方都没有使用过的参数-这会使代码的可读性降低。


1
但随后使用upperCaseFormatter具有冗余布尔值: upperCaseFormatter("test", true); // excluding the 'true' will result in a compiler warning。因此,接口是错误的,应该是: interface IFormatter { (data: string, toUpper? : bool): string; } 但是,这意味着即使函数签名中的函数也可以直接variableCaseFormatter使用with进行调用而variableCaseFormatter('test'); 无需指定toUpper。请参阅我的问题,以更简单地说明我当前的困惑:stackoverflow.com/questions/23305020
AJP 2014年

7
@AJP如果您要编写干净的代码,则永远不会编写变量大小写格式化程序。您将为上层编写一个类,为下层编写一个类,并完全避免使用讨厌的布尔参数。
Fenton 2014年

@AJP如果您upperCaseFormatter直接调用该接口是不相关的。
生气的丹

是否有更好的语法为对象方法提供这种功能接口?例如。{<IFormatter> myMethod(){return;}}
Artur Tagisow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.