Typescript + Angular:为Type <t>指定一个类型失败

时间:2018-05-17 07:56:29

标签: angular typescript types

我正在努力分配类型。

在下面的示例中,我希望能够使用我为函数createMock_UserService提供的类型。如果我调用具有所需类型的函数,它可以正常工作,但是当我没有提供类型并且想要手动分配Child时,它会失败并且下面的代码中记录了错误。

export class Parent {

}

export class Child extends Parent {

}

export function createMock_UserService<T extends Parent>(type?: Type<T>) {

  if(!type) {
    // this fails -> Type 'Child' is not assignable to type 'T'
    type = Child;
  }

  // do stuff with type
  injector.get(type);
}

// calling it works
createMock_UserService(Child);

// this doesn't
createMock_UserService();

Type<T>定义为(这是angular的代码和打字稿核心)

export declare const Type: FunctionConstructor;
interface FunctionConstructor {
    /**
      * Creates a new function.
      * @param args A list of arguments the function accepts.
      */
    new(...args: string[]): Function;
    (...args: string[]): Function;
    readonly prototype: Function;
}

我该如何使这项工作? 我感觉我错过了一些明显的东西。

Here's the stackblitz

1 个答案:

答案 0 :(得分:0)

我让它变得更复杂了。

以下是它的工作原理(略有重构)

export function createMock_UserService(injector: Injector, type: Type<UserService<UserWithPermissions>> = UserServiceMock): jasmine.Spy {
  return spyOn(injector.get(type), 'getCurrentUser');
}

不再使用泛型,只是简单的继承。