2015-10-13 13 views
8

は私がのDataItemの配列であるいくつかのプロパティdataItemsで基本クラスを考えてみましょう取得:変数の型と、このタイプの新しいインスタンスを作成

export class BaseClass{ 
    dataItems:DataItems[]; 
} 

それから私は、BaseClassのとそのdataItemsを拡張するいくつかのクラスを持っていますプロパティがdataItemsを拡張するいくつかのクラスの配列です:

export class BetterClass extends BaseClass{ 
    dataItems:BetterDataItems[]; 
} 

export class BestClass extends BaseClass{ 
    dataItems:BestDataItems[]; 
} 

今私はdataItemsを作成し、配列に追加しますBaseClassの中にメソッドを追加します。これをすべてBaseClassで行うことは可能でしょうか?使用するクラスに応じて、BetterDataItemsまたはBestDataItemsのインスタンスを作成する必要があります。私は単に添加瞬間

dataItemType: typeof DataItem; 

性BaseClassのおよびBaseClassのに延びる各クラスIは、適切なデータ項目の種類と、この変数を上書き:BetterClassで

dataItemType: typeof BetterDataItem = BetterDataItem; 

ベストクラス:

dataItemType: typeof BestDataItem = BestDataItem; 

そして、BaseClassの中で私はこれを実行します。

var dataItem = new this.dataItemType(); 

をこれが正常に動作しますが、私の質問はある - すべてでdataItemType性を有する回避することが可能だろうか?タイプdataItemsの配列を見つけて新しいインスタンスを作成できますか?

ありがとうございます!

答えて

4

活字体1.6コード:

class DataItems { 

} 

class BaseClass { 
    dataItems:DataItems[]; 
    dataItemType: typeof DataItems = DataItems; 
} 

はにコンパイル:

var DataItems = (function() { 
    function DataItems() { 
    } 
    return DataItems; 
})(); 
var BaseClass = (function() { 
    function BaseClass() { 
     this.dataItemType = DataItems; 
    } 
    return BaseClass; 
})(); 

そして、あなたはdataItemsプロパティのためにその型情報がBaseClassに失われて見ることができます。これがTypeScriptコンパイラの仕組みです。 It does not support runtime checking。だからあなたの質問への答えはノーです。 this.dataItemType = BetterDataItem;後で使用することができます。dataItemType: typeof BetterDataItem = BetterDataItem;作品と


あなたの問題を回避するには、あなたはtypescriptですコンパイラがJSコマンドを追加して作るので。

4

オプション1:あなたは、各サブクラスのメソッドをオーバーライドすることができます...

export class BaseClass{ 
    dataItems:DataItem[]; 

    create() { 
     this.dataItems.push(new DataItem()); 
    } 
} 

export class BetterClass extends BaseClass{ 
    dataItems:BetterDataItem[]; 

    create() { 
     this.dataItems.push(new BetterDataItem()); 
    } 
} 

export class BestClass extends BaseClass{ 
    dataItems:BestDataItem[]; 

     create() { 
     this.dataItems.push(new BestDataItem()); 
    } 
} 

オプション2:しかし、あなたは、一般的な基本クラスを導入した場合、あなたはそれぞれのdataItemsプロパティを定義する必要性を取り除くことができます異なるインスタンスを作成することもできます。

type MyT = typeof DataItem; 

export class GenericBaseClass<T extends DataItem> { 
    dataItems:T[]; 

    constructor(private dataType: MyT) { 

    } 

    create() { 
     this.dataItems.push(<T>new this.dataType()) 
    } 

} 

export class BaseClass extends GenericBaseClass<DataItem> { 
    constructor() { 
     super(DataItem); 
    } 
} 

export class BetterClass extends GenericBaseClass<DataItem> { 
    constructor() { 
     super(BetterDataItem); 
    } 
} 

export class BestClass extends GenericBaseClass<DataItem> { 
    constructor() { 
     super(BestDataItem); 
    } 
} 
+1

+1;完全性のために、 'BaseClass'に' instanceof'演算子を使うことができると思いますが、この場合は本当に反パターンです。 (http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf 4.13タイプアサーション) –

+0

ありがとうございました。ですから、変数からクラスの型を取得してクラスを作成することはできないと思いますか?instanceofは各タイプのチェックが必要なので、実際には良い解決策ではありません。 – zeroin

関連する問題