2017-10-19 1 views
0

나는 일반 클래스를 가지고 있으며 일부 인수로 인스턴스를 생성해야합니다. 빈 생성자를 사용하여 인스턴스를 만드는 방법을 찾았지만 과부하를 시도하면 오류가 발생합니다. '오류 TypeError : rowObj가 생성자가 아닙니다.'typescript에서 인수를 사용하여 <T>의 인스턴스를 만드는 방법은 무엇입니까?

빈 생성자가있는 이전 코드는 다음과 같습니다. :

export class DataTableViewModel<TRow extends DataTableRowViewModel> { 
public rowsViewModel: TRow[]; 
public totalItemsCount: number; 

constructor(dateService: DateService, rows?: any[]) { 
    this.rowsViewModel = []; 
    if (rows) { 
     rows.forEach((row) => { 
      let obj = Object.getPrototypeOf(Object.create(row) as TRow); 
      this.rowsViewModel.push(obj); 
     }); 
    } 
} 
} 

는 여기에 내가 일하기 위해 노력하고 새로운 코드입니다 : 당신은 변수 rowObj 선언 한

export abstract class DataTableViewModel<TRow extends DataTableRowViewModel> { 
public rowsViewModel: TRow[]; 
public totalItemsCount: number; 

constructor(dateService: DateService, rows?: { new(): any }[]) { 
    this.rowsViewModel = []; 
    if (rows) { 
     let rowObj: { new(dateService: DateService, rows?: any): TRow }; 
     rows.forEach((row) => { 
      let obj = new rowObj(dateService, row); 
      this.rowsViewModel.push(obj); 
     }); 
    } 
} 
} 
+0

'DataTableRowViewModel'이란 무엇이며 해당 생성자의 서명은 무엇입니까? – jcalz

+0

@jcalz 선언 된 생성자가 없으면 지금은 그냥 빈 클래스입니다. – Igor

답변

1

을하지만 당신은 그것을 초기화하지 않았습니다. 당신은 그것에 생성자를 할당해야 할 것이고, 당신은 어딘가에서 그 생성자를 얻을 수 있도록 준비해야 할 것입니다.

TRow 개체를 만들 수는 없습니다. 해당 이름은 컴파일 타임 형식 공간에만 존재하며 런타임에 존재하지 않습니다. 어딘가에 전화 할 수있는 구체적인 물건이 있어야합니다. 예를 들어 이것을 생성자에 다른 매개 변수로 추가 할 수 있습니다.

export abstract class DataTableViewModel<TRow extends DataTableRowViewModel> { 
    public rowsViewModel: TRow[]; 
    public totalItemsCount: number; 

    constructor(rowObj: { new(dateService: DateService, rows?: any): TRow }, 
    dateService: DateService, rows?: { new(): any }[]) { 
     this.rowsViewModel = []; 
     if (rows) { 
      rows.forEach((row) => { 
       let obj = new rowObj(dateService, row); 
       this.rowsViewModel.push(obj); 
      }); 
     } 
    } 
} 
+0

고맙지 만 어떻게 사용합니까? 첫 번째 주장으로 무엇을 전달해야합니까? – Igor

+0

추상 클래스를 구현하는 구체적인 클래스를 전달해야합니다. – Duncan

+0

도움을 주셔서 감사합니다, 그것은 작동합니다! – Igor

관련 문제