数组中的打字稿泛型类型丢失

时间:2019-10-08 12:42:13

标签: typescript typescript-generics

我试图获取一个Sequence类的实例,该实例具有一系列不同的Request对象,这些对象基本上遵循相同的模式。每个对象都有一个operation属性(即字符串)和一个operation值的属性。

问题是当我将这些请求对象类型传递给此Sequence类时,我不知道如何保留这些请求对象类型。

现在,我可能误解了泛型,可能对此进行了过度设计,可能具有冗余性。基本上,唯一的要求是我拥有一个具有所有那些请求的Sequence类,并且可以拥有一些打字稿魔术

希望您可以为此提供帮助

// using this to get around the generic Request class in Sequence class
class BaseRequest {}

class Request<T> extends BaseRequest {
  constructor(params: T) {
    super();
    Object.assign(this, params);
  }
}

class Sequence {
  requests: BaseRequest[];

  add(request: BaseRequest) {
    this.requests.push(requests);
  }

  merge(sequence: Sequence) {
    this.requests = this.requests.concat(sequence.requests);
  }
}

const RequestBuilder = <T>(payload: T) => {
  return <T>new Request(<T>payload);
}

interface CreateJobRequest {
  operation: 'createJob';
  createJob: any;
}

const params: CreateJobRequest = {
  operation: 'createJob',
  createJob: {},
};

let request = RequestBuilder(params);
let sequence = new Sequence();
sequence.requests.push(request);

现在,当我尝试访问该请求时,我得到:

// Property 'operation' does not exist on type 'BaseRequest'
if (sequence.requests[0].operation === '') {}

这也没有帮助(没有构建器)

class JobRequest extends BaseRequest implements CreateJobRequest {
  operation: 'createJob' = 'createJob';
  createJob: any = {};

  constructor() {
    super();
  }
}

let sequence = new Sequence();
sequence.requests.push(new JobRequest());

1 个答案:

答案 0 :(得分:0)

您正在使用键入为Sequence.requests的{​​{1}},因此,如果要保留该类型,还需要使BaseRequest[]通用。

例如

Sequence
class Sequence<T extends BaseRequest> {
  requests: T[];

  add(request: T) {
    this.requests.push(request);
  }

  merge(sequence: Sequence<T>) {
    this.requests = this.requests.concat(sequence.requests);
  }
}

请注意,这也将影响let request = RequestBuilder(params); let sequence = new Sequence<CreateJobRequest>(); sequence.requests.push(request); 的类型,因为您不能仅合并任何请求数组。