interfejs zapewnia, że wszystkie osoby dzwoniące z funkcji, które implementują interfejs dostarczenia wymaganych argumentów - data
i toUpper
.
Ponieważ TypeScript rozumie, że JavaScript nie ma nic przeciwko przekazywaniu argumentów, które nie są używane, sprytnie pozwala na to w implementacjach.
Dlaczego to jest w porządku? Ponieważ oznacza to, że możesz zastąpić dowolną implementację interfejsu bez wpływu na kod wywołujący.
Przykład: Możesz zastąpić implementację IFormatter
, a kod działa.
interface IFormatter {
(data: string, toUpper : bool): string;
};
var upperCaseFormatter: IFormatter = function (data: string) {
return data.toUpperCase();
}
var variableCaseFormatter: IFormatter = function (data: string, toUpper: bool) {
if (toUpper) {
return data.toUpperCase();
}
return data.toLowerCase();
}
// Switch between these at will
//var formatter = upperCaseFormatter;
var formatter = variableCaseFormatter;
formatter("test", true);
maszynopis Jeśli nie to zrobić, Twój upperCaseFormatter
musiałby mieć parametr zwany toUpper
, który nie był używany w dowolnym miejscu funkcji - co sprawia, że kod mniej czytelny.
Ale wtedy użycie 'upperCaseFormatter' ma nadmiarową wartość boolowską:' upperCaseFormatter ("test", true); // wyłączenie "true" spowoduje wyświetlenie ostrzeżenia kompilatora ". Zamiast tego interfejs jest nieprawidłowy i powinien wyglądać następująco: 'interface IFormatter {(data: string, toUpper?: Bool): string; } 'Ale to oznacza, że możesz wywołać' variableCaseFormatter' za pomocą 'variableCaseFormatter ('test');' bez określania 'toUpper' pomimo tego, że znajduje się w sygnaturze funkcji. Zobacz moje pytanie tutaj dla prostszego przykładu mojego obecnego zamieszania: http://stackoverflow.com/questions/23305020 – AJP
@AJP jeśli piszesz czysty kod, nigdy nie napiszesz zmiennego formatera. Napiszesz jedną klasę dla górnej, a drugą dla niższej i unikniesz nieprzyjemnego argumentu boolowskiego. – Fenton
@AJP W przypadku, gdy wywołasz 'upperCaseFormatter' bezpośrednio interfejs jest nieistotny. –