2017-02-22 6 views
0

TypeScriptでどうやって実現できますか?汎用引数として与えられたインタフェースを継承します

interface Clonable<TAttributes> extends TAttributes { // ERROR: TAttributes is not an interface 
    clone(): TAttributes 
    copyFrom(input: TAttributes) 
} 

function(x : Clonable<{title:string,url:string}>) { 
    alert(x.title) // ERROR: title is not an property of x 
} 

背景:TypeScript + Mithril + JSXを使用しようとしています。オートコンプリートでアトリビュートを公開するには、アトリビュートのタイプとともにアトリビュート「アトリビュート」が必要です。私のクラスには、 "this.attributes.title"よりも "this.title"を書く方が短いため、これらの属性を直接持たせたいと思っています。

ここにオプションがありますか?

+0

それはあなたが求めているものは非常に明確ではありません。あなたはそれを実装する方法や「タイプする」方法について質問していますか? (または両方..)。この無名関数は何ですか?それは何をすべきか? –

+0

このコードは無効です。 - 'インターフェイスはクラスまたは別のインターフェイスのみを拡張することがあります。' at ':' 1,41 ' - プロパティ' title 'は型に存在しません' Clonable <{title:string; url:文字列; }> '。' at: '7、13' これを実現する別の方法を探しています。 – FremyCompany

+0

明らかに、あなたはこれまで何を持っていますか? 'clone'と' cloneFrom'は実装されていますか?どのようにこれを使用しますか?あなたが持っているものとそれでやりたいことをより良く説明してください。 –

答えて

1

あなたはintersection typeを使用することができます。

interface Clonable<TAttributes> { 
    clone(): TAttributes 
    copyFrom(input: TAttributes) 
} 

type AttributesClonable<TAttributes> = Clonable<TAttributes> & TAttributes; 

function doSomething(x : AttributesClonable<{title:string,url:string}>) { 
    alert(x.title); // fine now 
} 

code in playground

+0

ありがとう、あなたがロック! – FremyCompany

関連する問題