Die Schnittstelle stellt sicher, dass alle Aufrufer von Funktionen, die die Schnittstelle implementieren, die erforderlichen Argumente liefern - data
und toUpper
.
Da TypeScript versteht, dass JavaScript nichts dagegen hat, wenn Sie Argumente übergeben, die nicht verwendet werden, lässt dies dies in Implementierungen geschickt zu.
Warum ist das in Ordnung? Weil dies bedeutet, dass Sie jede Implementierung der Schnittstelle ersetzen können, ohne den aufrufenden Code zu beeinflussen.
Beispiel: Sie können jede IFormatter
Implementierung ersetzen und der Code funktioniert.
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();
}
var formatter = variableCaseFormatter;
formatter("test", true);
Wenn TypeScript dies nicht tun upperCaseFormatter
würde , müsste ein Parameter namens aufgerufen werden toUpper
, der an keiner Stelle in der Funktion verwendet wird - wodurch der Code weniger lesbar wird.
upperCaseFormatter
einen redundanten booleschen Wert :upperCaseFormatter("test", true); // excluding the 'true' will result in a compiler warning
. Stattdessen ist die Schnittstelle falsch und sollte sein:interface IFormatter { (data: string, toUpper? : bool): string; }
Dies bedeutet dann aber, dass SievariableCaseFormatter
mit nurvariableCaseFormatter('test');
ohne Angabe aufrufen können,toUpper
obwohl sie in der Funktionssignatur enthalten ist. Siehe meine Frage hier für ein einfacheres Beispiel meiner aktuellen Verwirrung: stackoverflow.com/questions/23305020upperCaseFormatter
direkt aufrufen, ist die Schnittstelle irrelevant.