2017-11-23 2 views
1

私は、Javaスタイルの機能インタフェースをTypeScriptで使用したいと考えています。意味は、私はちょうど1つのメソッドとのインターフェイスを持っていると思います、そして、私はそのインターフェイスが期待されているどこにでもメソッドを供給することができるようにしたいと思います。ここで私が試したことは次のとおりです。TypeScriptのJavaスタイルの機能インターフェイスですか?

interface Observer<T> { 
    observe(t: T); 
} 

function addObserver<T>(observer: Observer<T>) { 
    // calls observer.observe at some point 
} 

// works 
addObserver({ 
    observe: t => console.log(t) 
}); 

// Property 'observe' is missing 
addObserver(t => console.log(t)); 

これをTypeScriptでどのように達成できますか?

答えて

2

言語にはfirst class functionsがないため、Javaの機能インタフェースが必要です。

Javascriptには(したがってtypescriptにも)含まれています。これは、慣用的であるためには、Javaの方法をエミュレートしようとするのではなく、関数を直接使用するべきであるということです。

これをtypecriptで表現するために、言語には関数型があります(the handbookの「関数型」を参照)。

次のようになり、あなたの例に適用

、:

interface Observer<T> { 
    (t: T): void; 
} 

ます。また、これに伴う問題があるタイプエイリアス(the handbookセクション「タイプの別名」を参照)

type Observer<T> = (t:T) => void; 
+0

を使用することができます'observe'関数が存在しないので、' addObserver'メソッドは 'observer.observe(...) 'の代わりに' observer(...) 'を呼び出さなければなりません – michaelsnowden

+0

これは正しいです。私が知る限り、あなたが望むものはTypeScriptでは不可能です。 – David

関連する問題