2017-02-20 6 views
1

В угловой полезности 2 тестирования я сделать что-то вроде этого:класса в качестве параметра функции в машинописном

fixture = TestBed.createComponent(EditableValueComponent); 

где EditableValueComponent является нормальным классом компонента.

Интересно, как это работает:

static createComponent<T>(component: Type<T>): ComponentFixture<T>; 

Beceause Я хочу сделать что-то подобное (я хочу, чтобы упростить некоторые испытания материала):

export class SuperFixture<T> 
{ 
    fixture: ComponentFixture<T>; 
    component: T; 

    constructor() 
    {   
     this.fixture = TestBed.createComponent(T); // <--- problem here! 
     this.component = this.fixture.componentInstance; 
    } 
} 

Проблема заключается в том:

«T» относится только к типу, но используется здесь как значение ».

EDIT # 1

Я решил проблему так:

constructor(component) 
{ 
    this.fixture = TestBed.createComponent<T>(component); 

Но я до сих пор не знаю, как это работает ..

ответ

0

Вы все еще должны пройти фактический класс (функция конструктора, которая создает экземпляры класса) в конструкторскую функцию от SuperFixture. Под капотом TestBed.createComponent вызовы предоставляют функцию конструктора с new для создания экземпляра предоставленного класса. Так SuperClass подпись может выглядеть следующим образом:

class SuperFixture<T> 
{ 
    fixture: ComponentFixture<T>; 
    component: T; 

    // passing in the constructor for instances of T 
    constructor(componentConstructor: new() => T) 
    { 
    this.fixture = TestBed.createComponent<T>(componentConstructor); 
    this.component = this.fixture.componentInstance; 
    } 
} 
0

работал над этим ответом, но должен был выйти на кофе. ¯_ (ツ) _/¯

Функция языка, которую вы используете, называется Generic в TypeScript. Он позволяет определять типы во время выполнения с помощью «переменных типа» (например, <T>), которые отделены от аргументов функции.

Раньше типа переменной была передаются в качестве аргумента функции в, когда функция ожидаемой экземпляр типа T. Это означает, что ошибка.

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

SuperFixture объект получает значение T при ее создании, а затем он будет передавать эту переменную типа в createComponent в конструкторе, наряду со значением component.