首页 > 解决方案 > 数组中的打字稿泛型类型丢失

问题描述

我正在尝试获取一个 Sequence 类的实例,该实例具有一组不同的 Request 对象,这些对象基本上遵循相同的模式。这些对象中的每一个都有一个operation属性(即字符串),以及一个具有任何值的属性operation

问题是当我将它们传递给这个 Sequence 类时,我不知道如何保留这些 Request 对象类型。

现在,我可能误解了泛型,可能过度设计了它,可能有冗余。基本上对此的唯一要求是我有一个包含所有这些请求的序列类,并且我可以拥有一些打字稿魔法

希望你能帮我解决这个问题

// 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());

标签: typescripttypescript-generics

解决方案


您正在使用 Sequence.requestswhich is typed as 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);

请注意,这也会影响 的类型merge,因为您不能只合并任何请求数组。


推荐阅读