作为变量类型时,Interface和InstanceType <typeof Class>有什么区别?

时间:2019-09-30 08:33:25

标签: typescript

例如:

HttpService.ts

export interface IHttpService {
  request(): Promise<any>;
  formPostRequest(): any;
}

export class HttpService implements IHttpService {
  public async request() {
    //
  }

  public formPostRequest() {
    //
  }
}

现在,根据依赖项注入,我将使用HttpService。像这样:

GoogleAccount.ts

import { HttpService } from './HttpService';

class GoogleAccount {
  private httpService: InstanceType<typeof HttpService>;
  constructor(httpService: InstanceType<typeof HttpService>) {
    this.httpService = httpService;
  }

  public findGoogleAccountById(id: string) {
    return this.httpService.request();
  }
}

以上代码将InstanceType的{​​{1}}和typeof预定义类型用作TypeScript的类型

我经常使用的另一种方法是使用httpService作为interface的类型,如下所示:

httpService

它们在import { IHttpService } from './HttpService'; class GoogleAccount2 { private httpService: IHttpService; constructor(httpService: IHttpService) { this.httpService = httpService; } public findGoogleAccountById(id: string) { return this.httpService.request(); } } 的类型系统下都可以正常工作。 TypeScript不抱怨类型错误。那么,当作为静态类型的变量时,它们之间有什么区别?

在这种情况下也许不需要使用tsc吗?

1 个答案:

答案 0 :(得分:1)

我同意,如果您知道需要实现的基础接口,则不必使用InstanceType<typeof HttpService>。 InstanceType的用法应限于无法直接获取基础类型的情况。这里有一些很好的用例Link