返回泛型的TypeScript工厂函数

时间:2016-08-01 18:21:40

标签: javascript typescript

(Typescript 2.1.0 / VS Code 1.3.0)

我有一个Request类看起来像

export default class Request<T>{
  static name = "adf";
  private url:string;
  constructor(url:string){
    this.url = url;
  }

  list(){
    return new Promise<T[]>(resolve=>{
      request(this.url,function(err,data: T[]){
        resolve(data);
      })
    });
  }
  get(id:number){
    return new Promise<T>(resolve=>{
      request(this.url,function(err,data: T){
        resolve(data);
      });
    });
  }
}

我试图像这样创建一个工厂函数:

const enum requestType{
  machine,
  part
}
export default function(type: requestType): Request<T>(T.endpoint){
  return new Request<Machine>(Machine.endpoint);
}

我收到错误cannot find name T,并抱怨使用隐含的任何内容。制作返回通用的工厂函数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果你想拥有一个泛型函数,那么它需要具有泛型类型decelration:
function fn<GenericType>(....

根据您的代码,您的功能看起来应该更像这样:

function factory<T>(type: requestType): Request<T> {
    switch(type) {
        case requestType.machine:
            return new Request<T>(Machine.endpoint);

        case requestType.part:
            return new Request<T>(Part.endpoint);
    }

    return null;
}

然后你这样称呼它:

let request: Request<Machine> = factory(requestType.machine);