Oto opracowanie na the accepted answer.
O ile mi wiadomo, jedynym sposobem na wykonanie podpisu rozmówcy jest użycie funkcji/metody. Aby zaimplementować pozostałe elementy, po prostu zdefiniuj je na tej funkcji. Może to wydawać się dziwne dla programistów pochodzących z C# lub Java, ale myślę, że jest to normalne w JavaScript.
W języku JavaScript byłoby to proste, ponieważ można po prostu zdefiniować funkcję, a następnie dodać członków. Jednak system typu TypeScript nie pozwala na to, ponieważ w tym przykładzie Function
nie definiuje członka text2
.
więc do osiągnięcia rezultatu, który ma, trzeba ominąć system typu podczas definiowania użytkowników na temat funkcji, a następnie można rzutować wynik typu interfejsu:
//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
pamiętać, że nie trzeba używać zamknięcia. Można po prostu zadeklarować zmienną tymczasową w tym samym zakresie, co wynikowa implementacja interfejsu. Inną opcją jest nazwanie funkcji zamknięcia w celu poprawy czytelności.
Oto, co moim zdaniem jest bardziej realistyczny przykład:
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
Krótka odpowiedź brzmi: "zajęcia nie pasują do tego interfejsu" wymienione w pytaniu, które łączysz http://stackoverflow.com/a/12770145/390330 – basarat