在Angular 2测试实用程序中,我做了类似这样的事情:
fixture = TestBed.createComponent(EditableValueComponent);
其中EditableValueComponent是普通组件类。
我想知道它是如何运作的:
static createComponent<T>(component: Type<T>): ComponentFixture<T>;
因为我想做类似的事情(我想简化一些测试的东西):
export class SuperFixture<T>
{
fixture: ComponentFixture<T>;
component: T;
constructor()
{
this.fixture = TestBed.createComponent(T); // <--- problem here!
this.component = this.fixture.componentInstance;
}
}
问题是:
'T'仅指类型,但在此处用作值。'
编辑#1
我用这种方式解决了问题:
constructor(component)
{
this.fixture = TestBed.createComponent<T>(component);
但我仍然不知道它是如何运作的。
答案 0 :(得分: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;
}
}
答案 1 :(得分:-1)
正在努力解决这个问题,但不得不走出咖啡馆。 _(ツ)_ /¯
您正在使用的语言功能在TypeScript中称为Generic。它允许在运行时使用“类型变量”(如<T>
)定义类型,它们与函数参数分开。
之前,当函数需要类型为T的实例时,类型变量作为函数参数传递。这就是错误的含义。
您所做的更改有效,因为您正在将类型变量和实例传递到调用中的正确位置。
SuperFixture
对象在创建时获取T
的值,然后它会将该类型变量传递给构造函数中的createComponent
,以及{{1}的值}}