类作为Typescript中的函数参数

时间:2017-02-20 18:19:12

标签: javascript angular typescript

在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);

但我仍然不知道它是如何运作的。

2 个答案:

答案 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}的值}}