Diciamo che ho una classe di base con alcuni DataItems di proprietà che è matrice di DataItem:Ottenere tipo di una variabile e creare nuova istanza di questo tipo
export class BaseClass{
dataItems:DataItems[];
}
allora ho diverse classi che estendono BaseClass e le loro DataItems proprietà è un array di una classe che si estende DataItems:
export class BetterClass extends BaseClass{
dataItems:BetterDataItems[];
}
export class BestClass extends BaseClass{
dataItems:BestDataItems[];
}
Ora voglio aggiungere un metodo in BaseClass che crea DataItems e li aggiunge alla gamma. Sarebbe possibile fare tutto questo in BaseClass? Ho bisogno di creare un'istanza di BetterDataItems o BestDataItems, a seconda della classe utilizzata.
Al momento ho semplicemente aggiunto:
dataItemType: typeof DataItem;
proprietà BaseClass e in ogni BaseClass classe che estende sovrascrivo questa variabile con il corretto tipo di elemento di dati:
in BetterClass:
dataItemType: typeof BetterDataItem = BetterDataItem;
in BestClass:
dataItemType: typeof BestDataItem = BestDataItem;
E poi, in BaseClass faccio questo:
var dataItem = new this.dataItemType();
Questo funziona bene, ma la mia domanda è - sarebbe possibile per evitare di avere dataItemType
proprietà a tutti? Posso trovare un tipo di array dataItems
e quindi creare una nuova istanza?
Grazie!
+1; Per completezza, penso che tu possa usare l'operatore 'instanceof' in' BaseClass', ma in questo caso è davvero un anti-pattern. (http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf 4.13 Tipo Asserzioni) –
Grazie. Quindi presumo che non sia possibile ottenere semplicemente un tipo di classe da una variabile e quindi creare una classe?instanceof richiederebbe il controllo di ogni tipo, quindi non è davvero una buona soluzione. – zeroin