2016-07-13 7 views
1

私はTypeScriptを初めて使っていますが、まだ物事のハングアップを取得しようとしています。ダックタイプのユニオンタイプをTypeScriptインターフェイスに処理する方法は?

タイムラインを構成する一連のイベントがあります。

const timeline = [{ 
    type: 'payment', 
    amount: '12.23 USD', 
    when: '<iso timestamp>' 
},{ 
    type: 'payment', 
    amount: '12.23 USD', 
    when: '<iso timestamp>' 
},{ 
    type: 'refunded', 
    amount: '2.00 USD', 
    when: '<iso timestamp>' 
},{ 
    type: 'payment', 
    amount: '12.23 USD', 
    when: '<iso timestamp>' 
},{ 
    type: 'delinquent', 
    when: '<iso timestamp>' 
}] 

だから私が去っと組合型としてIEventを定義しました:

interface IPaymentEvent { 
    amount: string, 
    when: string 
} 

interface IRefundedEvent { 
    amount: string, 
    when: string 
} 

interface IDelinquentEvent { 
    when: string 
} 

type IEvent = IPaymentEvent | IRefundedEvent | IDelinquentEvent 

問題は、私は私の中で、このタイプの情報を使用する方法が混乱しているということである彼らは、このようなものを見てコード。そのタイムラインを、私が今定義した実際のタイプに変換するにはどうすればよいですか?そして、配列を反復処理するときに、どのように私はunion型を解体するのですか?これで

私の試みは、次のようになります。

class PaymentEvent implements IPaymentEvent {} 
class RefundedEvent implements IRefundedEvent {} 
class DelinquentEvent implements IDelinquentEvent {} 

const duckTypeMap = { 
    payment: PaymentEvent, 
    refunded: RefundedEvent, 
    delinquent: DelinquentEvent 
} 

const typedTimeline = timeline.map(x => { 
    return duckTypeMap[x.type](x) 
}) 

console.log(typedTimeline) 

But that's not quite working

私はここに一般的な方法が存在しなければならないという感覚を得ます。私はまた、これを行う2つの方法、(1)es6クラス、(2)es6クラスなしで興味があります。後者の場合、型システムは、JSONをどのようにしてアヒルを入力するかを教えれば助けてくれます。

+0

はのように、タイプとして文字列を使用して考えてみましょう:あなたはinstanceof演算子を使用することができます「と入力」配列の反復処理時にアイテムの種類を決定するために

interface IEvent { when: string } class PaymentEvent implements IEvent { public amount:string; public when:string; } const typedTimeline:IEvent[] = timeline.map(x => { let target = new duckTypeMap[x.type]; for (const key in x) { target[key] = x[key]; } return target; }); 

'インターフェイスIRefundedEvent {type:" refunded "; } '。 –

答えて

3

あなたはほぼあります。修正するためにいくつかのこと:

  1. あなたはnewキーワード使用すべきタイプのインスタンスを作成するために - あなたはコピーコンストラクタを作成したり、単に(手動または一部でJSONオブジェクトをマップする必要があり、このインスタンスのフィールドを初期化するためにnew duckTypeMap[x.type];
  2. をとしょうかん)。例えばthisを見てください。
  3. クラスがインターフェイスを実装する場合は、このインターフェイスのメンバーを宣言する必要があります。また、unionタイプを使用して得られるものについてはわかりません。多相配列を持つためには、単一のインタフェースIEventwhenというプロパティで定義し、それをすべてのクラスで実装することができます。

このような何か:

if(item instanceof RefundedEvent) 
+0

(2)バマー - このタイプを表すクラスを自動的に生成する方法はありますか? (3)イベントは異なるフィールドを持つ可能性があるため、ユニオンタイプのポイントがあります。そして、私は反復処理、インスタンスのチェック、およびイベントのレンダリングを別々にできるようにしたい。 – Chet

+0

待って、私はこれのような何かをすることができますか? 'paymentEvent = {when:string、type:string、amount:string}' – Chet

+0

自動的に何から生成するのですか? Json? (3) 'any'オブジェクトの配列は、それらと共通するものがない場合に使用できます。そして、はい、私が知っている限り、インラインタイプを定義することができます –