2017-11-07 5 views
1

I 장식 모델 클래스가 있습니다타이프 스크립트에서 제네릭 형식의 메타 데이터를 가져올 수 있습니까?

@Api('payments/deposit') 
export class DepositsModel { 
    public id: number; 
    public created_at: Date; 
    ... 

각 구성 요소의 생성자에서 내 모델 클래스를 사용 가리키는 데이터 서비스를 주입하고 있습니다를 :

... 
public constructor( 
    private $api: GridApiService<DepositsModel> 
... 
) { 
    this.service = new GridService($api); 
    ... 
} 
... 

그래서, 내 멋진 구성 요소가 멋진 서비스를 제공, 마녀는 내 모델의 메타 데이터를 얻을 수와 ...

.. 알고하지만 어떻게 내가 할 수 있어야 작동 데이터의 유형을 알고 내 GridApiService?

@Injectable() 
export class GridApiService<T>{ 
    constructor(
    $http: HttpClient, 
) { 
    let api = Reflect.getMetadata('Api', T); 
    } 

을 그리고 오류 메시지가 있어요 : 나는 시도했다 'T'만을 타입을 사용하는,하지만 여기에 값으로 사용하고있다.

UPDATE

당신이 나에게 내 GridApiService로 초기화 데이터를 전달하는 또 다른 방법을 조언 할 수, 마녀 새로운 키워드로 생성되지, DI 통해 주입해야 하는가?

답변

5

클래스 데코레이터를 통해 메타 데이터로 방출 될 수있는 유형을 제외하고는 런타임시 TypeScript 유형이 존재하지 않습니다. 일반 유형 cannot be emitted이며 각도 DI에는 존재하지 않습니다. GridApiService<DepositsModel>은 유형 검사 외에는 중요하지 않습니다.

class DepositsGridApiService extends GridApiService { 
    Model = DepositsModel; 
} 
+0

네,하지만 서비스의 hord을 생성하지만, 보편적 인 일이없는 수있는 방법을 찾고 있었다 ... :

GridApiServiceDepositsModel 사이의 연결

는 예를 들어, 상속, 클래스 디자인으로 표현되어야한다 –

+0

프레임 워크의 기능을 계속 진행해야하며 프레임 워크는 이와 같은 기능을 제공하지 않습니다. 인젝터 당 2 종류 이상의 GridApiService 이있을 수있는 경우 서브 클래스 화하거나 T 인수로 인스턴스화 된 팩토리 함수 또는 래퍼 클래스를 주입해야합니다. 이는 잠재적 인 XY 문제이며 사용자가 원하는 것과 원하는 솔루션이 다를 수 있습니다. 그리고 AOT는 몇 가지 한계를 부과 할 것입니다. – estus