接口要求实现该接口的函数的每个调用者都提供两个必需的参数,也就是 text 和 capitalize。
TypeScript 知道 JavaScript 允许传入额外但不使用的参数,因此允许实现省略这些参数。
为什么这样可以?因为这让你能替换不同的实现,而不必修改调用代码。
比如,下面两种 ITextRenderer 实现都能替换进去,而且代码仍然可以运行。
interface ITextRenderer {
(text: string, capitalize: boolean): string;
};
var capitalRenderer: ITextRenderer = function (text: string) {
return text.capitalizeCase();
}
var flexibleRenderer: ITextRenderer = function (text: string, capitalize: boolean) {
if (capitalize) {
return text.capitalizeCase();
}
return text.toLowerCase();
}
// Either implementation can go here
//var renderer = capitalRenderer;
var renderer = flexibleRenderer;
renderer("demo", true);
如果 TypeScript 不允许这样做,capitalRenderer 就必须声明一个正文完全不使用的 capitalize 参数,这会让函数更难读。
从英语翻译·查看原文The interface requires every caller of an implementing function to provide both mandatory parameters, text and capitalize.
TypeScript knows that JavaScript tolerates receiving extra arguments which go unused, so implementations are permitted to omit them.
What makes that acceptable? It lets you replace one implementation with another without changing the caller.
For instance: Both implementations of ITextRenderer below can be substituted and still work.
interface ITextRenderer {
(text: string, capitalize: boolean): string;
};
var capitalRenderer: ITextRenderer = function (text: string) {
return text.capitalizeCase();
}
var flexibleRenderer: ITextRenderer = function (text: string, capitalize: boolean) {
if (capitalize) {
return text.capitalizeCase();
}
return text.toLowerCase();
}
// Either implementation can go here
//var renderer = capitalRenderer;
var renderer = flexibleRenderer;
renderer("demo", true);
Without this allowance in TypeScript, capitalRenderer would need a capitalize parameter even though its body never uses that parameter at all, making the function harder to read.