2013-02-11 5 views
35

Perché Typescript non mi avvisa che la funzione che sto definendo non corrisponde alla dichiarazione dell'interfaccia, ma mi avvisa se provo a richiamare la funzione.Interfaccia funzione dattiloscritto

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. 

risposta

53

L'interfaccia garantisce che tutti i chiamanti di funzioni che implementano l'interfaccia forniscono gli argomenti richiesti - data e toUpper.

Perché TypeScript riconosce che JavaScript non si preoccupa se si passano argomenti che non vengono utilizzati, abilmente consente questo nelle implementazioni.

Perché va bene? Perché significa che è possibile sostituire qualsiasi implementazione dell'interfaccia senza influire sul codice di chiamata.

Esempio: è possibile sostituire l'implementazione IFormatter e il codice funziona.

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); 

Se dattiloscritto non lo ha fatto, il tuo upperCaseFormatter avrebbe dovuto avere un parametro chiamato toUpper che non è stato utilizzato ovunque nella funzione - il che rende il codice meno leggibile.

+0

Tuttavia, l'uso di 'upperCaseFormatter' ha un valore booleano ridondante:' upperCaseFormatter ("test", true); // escludendo il 'true' si otterrà un warning del compilatore'. Quindi l'interfaccia è sbagliata e dovrebbe essere: 'interfaccia IFormatter {(data: string, toUpper?: Bool): string; } 'Ma questo significa che puoi invocare' variableCaseFormatter' con just 'variableCaseFormatter ('test');' senza specificare 'toUpper' nonostante sia nella firma della funzione. Vedi la mia domanda qui per un esempio più semplice della mia attuale confusione: http://stackoverflow.com/questions/23305020 – AJP

+5

@AJP se stavi scrivendo codice pulito, non avresti mai scritto un formattatore di maiuscole/minuscole. Scriverei una classe per la parte superiore e una per quella inferiore ed evitare del tutto la brutta argomentazione booleana. – Fenton

+0

@AJP Nel caso in cui si chiami 'upperCaseFormatter' direttamente l'interfaccia è irrilevante. –