Hier ist eine Weiterentwicklung auf the accepted answer.
Soweit ich weiß, ist die einzige Möglichkeit, eine Call-Signatur zu implementieren, die Verwendung einer Funktion/Methode. Um die restlichen Elemente zu implementieren, definieren Sie sie einfach in dieser Funktion. Das mag für Entwickler aus C# oder Java seltsam erscheinen, aber ich denke, das ist normal in JavaScript.
In JavaScript wäre dies einfach, weil Sie einfach die Funktion definieren und dann die Mitglieder hinzufügen können. Das Typskript-Typsystem lässt dies jedoch nicht zu, da Function
in diesem Beispiel kein text2
-Element definiert.
So das gewünschte Ergebnis zu erzielen, müssen Sie die Art System umgehen, während Sie die Mitglieder auf die Funktion, zu definieren und dann können Sie das Ergebnis an den Interface-Typ gegossen:
//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
Beachten Sie, dass Sie brauche keinen Verschluss. Sie könnten Ihre temporäre Variable einfach im selben Umfang wie die resultierende Schnittstellenimplementierung deklarieren. Eine andere Möglichkeit besteht darin, die Schließfunktion zu benennen, um die Lesbarkeit zu verbessern.
Hier ist, was ich denke, ein realistischeres Beispiel ist:
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
Kurze Antwort ist "Klassen können diese Schnittstelle nicht übereinstimmen" in der Frage erwähnt, die Sie http://StackOverflow.com verlinkt/a/12770145/390330 – basarat