これは、受け入れられた答えの詳細です。
私の知る限り、呼び出し署名を実装する唯一の方法は、関数/メソッドを使用することです。残りのメンバーを実装するには、この関数で定義するだけです。これは、C# や Java から来た開発者には奇妙に思えるかもしれませんが、JavaScript では普通のことだと思います。
JavaScript では、関数を定義してメンバーを追加するだけなので、これは簡単です。ただし、この例ではメンバーFunction
を定義していないため、TypeScript の型システムではこれが許可されていません。text2
したがって、目的の結果を得るには、関数でメンバーを定義するときに型システムをバイパスする必要があり、その後、結果をインターフェイス型にキャストできます。
//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
クロージャを使用する必要がないことに注意してください。結果のインターフェイス実装と同じスコープで一時変数を宣言するだけです。もう 1 つのオプションは、クロージャ関数に名前を付けて読みやすくすることです。
以下は、より現実的な例だと思います。
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");