2016-10-20 2 views
0

私はタイプスクリプトで非常に新しいです。TSで一般的なクラスのプロパティのセットを作成

TS2420 Class 'Booking' incorrectly implements interface 'MetaObject'. 
    Property 'active' is missing in type 'Booking'. 

私は私が指定したくないいくつかのプロパティメタオブジェクトを持ってしようとしています:コードの大は、そのエラーを誘発すること

export interface MetaObject { 
    public creationDate: string, 
    public modificationDate: string 
} 

export class A implements MetaObject { 
    constructor(
    public id:number, 
    ) { } 
} 

export class B implements MetaObject { 
    constructor(
    public id:number, 
    ) { } 
} 

私は、次のコードを持っています私のコンストラクタですが、私はすべてのオブジェクトに存在したいと思っています。これまで私はこれらのプロパティを持つインターフェイスを作成しており、クラスはそれを実装しています。そうするのが正しい方法ですか?ここでの目的は、実際にクラスに他のものを追加する必要はなく、インターフェイスに共通のプロパティ名、型、...を保持することです。

これは正しい方法ですか?

答えて

2

いいえ、それはそれを行う方法、いくつかのことではありません。

あなたがインターフェイスに入れ

(1)すべては性質が公開されていることを指定する必要はありません、公開されている、そしてそれは、その結果エラー。

(2)あなたはその後、そうでない場合、コンパイラは文句を言うでしょう、あなたのクラスにこれらのプロパティを追加する必要がありますインターフェイスを実装する場合:

クラス「」誤っインタフェースを実装する「メタオブジェクト」。
プロパティ 'creationDate'がタイプ 'A'にありません。

だから、それは次のようになります。あなたは再書き込み実装したくない場合は

interface MetaObject { 
    creationDate: string; 
    modificationDate: string; 
} 

class A implements MetaObject { 
    constructor(
     public id: number, 
     public creationDate: string, 
     public modificationDate: string) { } 
} 

class B implements MetaObject { 
    constructor(
     public id: number, 
     public creationDate: string, 
     public modificationDate: string) { } 
} 

code in playground

あなたは、基本クラスが必要になります。

​​

code in playground

もう一つの選択肢はuse mixinsですが、私はあなたの状況では残酷だと思います。

+0

creationDateとmodificationDateがコンストラクタでpublicではないのはなぜですか? – Scipion

+0

これらは基本クラス( 'MetaObject')で' protected'です。拡張クラスではメンバーとして宣言する必要はなく、スーパーに渡されます。 –

関連する問題