Ecco un'elaborazione su the accepted answer.
Per quanto ne so, l'unico modo per implementare una firma di chiamata è utilizzare una funzione/metodo. Per implementare i membri rimanenti, basta definirli su questa funzione. Questo potrebbe sembrare strano agli sviluppatori provenienti da C# o Java, ma penso che sia normale in JavaScript.
In JavaScript, questo sarebbe semplice perché è possibile semplicemente definire la funzione e quindi aggiungere i membri. Tuttavia, il sistema di tipi di TypeScript non lo consente perché, in questo esempio, Function
non definisce un membro text2
.
Quindi, per ottenere il risultato desiderato, è necessario bypassare il sistema di tipo mentre si definiscono i membri sulla funzione, e quindi si può lanciare il risultato per il tipo di interfaccia:
//A closure is used here to encapsulate the temporary untyped variable, "result".
var implementation = (() => {
//"any" type specified to bypass type system for next statement.
//Defines the implementation of the call signature.
var result: any =() => "Hello";
//Defines the implementation of the other member.
result.text2 = (content: string) => { };
//Converts the temporary variable to the interface type.
return <MyInterface>result;
})(); //Invokes the closure to produce the implementation
Si noti che è non è necessario utilizzare una chiusura. Si potrebbe semplicemente dichiarare la variabile temporanea nello stesso ambito dell'implementazione dell'interfaccia risultante. Un'altra opzione è denominare la funzione di chiusura per migliorare la leggibilità.
Ecco quello che penso è un esempio più realistico:
interface TextRetriever {
(): string;
Replace(text: string);
}
function makeInMemoryTextRetriever(initialText: string) {
var currentText = initialText;
var instance: any =() => currentText;
instance.Replace = (newText: string) => currentText = newText;
return <TextRetriever>instance;
}
var inMemoryTextRetriever = makeInMemoryTextRetriever("Hello");
http://stackoverflow.com/questions/16248812/implement-an-indexible-interface#comment23254752_16248812 – basarat
risposta breve è "classi non può corrispondere tale interfaccia" di cui parla la questione si è collegato http://stackoverflow.com/a/12770145/390330 – basarat