2015-04-03 3 views
3

Как я могу сделать следующую работу, как ожидалось, в Typcript?Как создать новый экземпляр родового типа моего класса TypScript?

export class ProxyObject<T> { 
    private _dataObject:T; 
    constructor(dataObject?:T) { 
     if (dataObject) { 
      this.dataObject = dataObject; 
     } else { 
      //create a new instance of the generic <T> here 
      this.dataObject = <T> new Object(); 
     } 
    } 
    set dataObject(dataObject:T) { 
     this._dataObject = dataObject; 
    } 
    get dataObject():T { 
     return this._dataObject; 
    } 
} 

export class ClassA { 
    myCoolProperty = "My Cool Property"; 
} 

Когда я делаю следующее:

export class MyObject extends ProxyObject<ClassA> { 
} 

А потом:

var obj = new MyObject(); 
obj.dataObject.myCoolProperty === undefined 

Ни одно из свойств или функций CLASSA не существует на DataObject внутри MyObject, как я ожидал. Например, я ожидал, что dataObject получит myCoolProperty.

Я пытаюсь написать класс ProxyObject, который при расширении хранилища DataObject вводится как общий.

Спасибо!

+0

Я предполагаю, что вам нужно сделать 'obj.dataObject(). MyCoolProperty', потому что сгенерированный javascript, вероятно, превращает вашу публикацию в свойство. – Pricey

+0

Я довольно уверен, что этот код: 'this.dataObject = new Object();' На самом деле не создается новый экземпляр родового. Отладчик показывает dataObject как пустой объект. –

+0

Извините, что у меня возникла неправильная идея при первом чтении. Это может помочь вам: https://www.stevefenton.co.uk/Content/Blog/Date/201407/Blog/Creating-TypeScript-Classes-Dynamically/ – Pricey

ответ

0

<T> new Object() не создает экземпляр T. Попробуйте это:

class MyObject extends ProxyObject<ClassA> { 
    constructor(dataObject?: ClassA) { 
     if (dataObject) { 
       super(dataObject); 
      } else { 
       //create a new instance of the generic <T> here 
       super(new ClassA()); 
      } 
    } 
} 
+0

Это будет работать, просто требуется немного больше кода при каждом продлении ProxyObject. Решение, которое я опубликовал, немного проще ИМХО. Слишком плохо, что нет простого способа получить новый экземпляр Generic Type. Благодаря! –

0

Я открыт для некоторых прохладных ответов на этот вопрос, но сейчас я просто добавил метод, который должен быть перегружен, чтобы вернуть новый экземпляр Generic.

export class ProxyObject<T> { 

    private _dataObject:T; 

    constructor(dataObject?:any) { 
     if (dataObject) { 
      this.dataObject = dataObject; 
     } else { 
      this.dataObject = this.createEmptyDataObject(); 
     } 
    } 

    protected createEmptyDataObject():T { 
     throw new Error('You must overload the createEmptyDataObject() method on ProxyObject'); 
     return null; 
    } 

    set dataObject(dataObject:T) { 
     this._dataObject = dataObject; 
    } 

    get dataObject():T { 
     return this._dataObject; 
    } 
} 

Например, это пример:

export class TabularRecord extends ProxyObject<TabularRecordDO> { 

    createEmptyDataObject():TabularRecordDO { 
     return new TabularRecordDO(); 
    } 

    get record():any { 
     return this.dataObject.record; 
    } 

    set record(record:any) { 
     this.dataObject.record = record; 
    } 
} 
3

Поскольку машинопись дженерики реализованы с использованием типа стирания T нет во время выполнения, вы можете однако передать класс в качестве параметра к основанию класса, а затем использовать его для создания нового объекта.

export class DataObjectBase { 
} 

export class ProxyObject<T extends DataObjectBase> { 
    private _dataObject: T; 
    constructor(dataObject?: T, cls?: typeof DataObjectBase) { 
     if (dataObject) { 
      this.dataObject = dataObject; 
     } else { 
      //create a new instance of the generic <T> here 
      this.dataObject = <T> new cls(); 
     } 
    } 
    set dataObject(dataObject: T) { 
     this._dataObject = dataObject; 
    } 
    get dataObject(): T { 
     return this._dataObject; 
    } 
} 



export class ClassA { 
    myCoolProperty = "My Cool Property"; 
} 


export class MyObject extends ProxyObject<ClassA> { 
    public constructor(dataObject?: ClassA) { 
     super(dataObject, ClassA); 
    } 
} 

new MyObject(); 
obj.dataObject.myCoolProperty !== undefined 

Этот подход требует еще немного кода в производных классах, но по крайней мере он сохраняет все логики в базовом классе

Класс DataObjectBase необходимо, так как если бы я использовал TypeOf Object вместо , ClassA не мог выполнить сигнатуру класса Object (так как в ClassA не имеют конструкторов Object). DataObjectBase - это класс с единственным конструктором без аргументов, который выполняет ClassA, хотя и явно не вытекающий из него.

Смежные вопросы