数组中的typescript泛型类型丢失

数组中的typescript泛型类型丢失,typescript,typescript-generics,Typescript,Typescript Generics,我试图得到一个Sequence类的实例,它有一个不同请求对象的数组,这些请求对象基本上遵循相同的模式。这些对象中的每一个都有一个操作属性(即字符串),以及一个具有操作的任何值的属性 问题是,当我将这些请求对象类型传递给这个Sequence类时,我不知道如何保留它们 现在,我可能误解了泛型,可能设计过度,可能有冗余。基本上,唯一的要求是我有一个序列类,它包含所有这些请求,并且我可以有一些类型脚本魔术 希望你能帮我 // using this to get around the generic Re

我试图得到一个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);
这也没有帮助(没有构建器)


您正在使用类型为
BaseRequest[]
Sequence.requests
,因此如果要保留该类型,还需要将
Sequence
设置为泛型

e、 g

类序列{
请求:T[];
添加(请求:T){
this.requests.push(请求);
}
合并(序列:序列){
this.requests=this.requests.concat(sequence.requests);
}
}
let request=RequestBuilder(参数);
让序列=新序列();
顺序.请求.推送(请求);

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

为什么TS会知道您定义的
BaseRequest
就是
JobRequest
,而您从未验证过这一点?@VLAZ谢谢您,很抱歉我的愚蠢:),但我有点想问这个问题,或者绕开这个问题,你怎么说你需要请求数组是一个能准确记住给定索引中存在哪种类型元素的数组?如果是这样的话,在类型系统中没有好的方法来表示将两个元组连接在一起时发生的情况(因此
merge()
将很难键入),甚至在元组的末尾追加也需要大量的跳转(因此
add()
将很讨厌键入)。如果你直接变异数组prop
sequence.requests.push()
,这是没有希望的,因为变异很难表示。我想我需要在这里看到一个更完整的用例,展示你打算如何与包含不止一种类型请求的
sequence
进行交互。我的意思是,如果你对持有
数组的特定序列没问题,但是如果你需要在数组的不同位置跟踪
{operation:unknown}
的子类型,就会出现问题。@jcalz我不确定我是否理解“okay with
operation:unknown
”。稍后,在某个地方,我需要遍历这些对象(请求),检查它们的类型并相应地执行操作。。。如果这对打字有帮助的话,我可以做一个实例检查。H.B.的答案只适用于一个请求,但当试图合并不同类型的请求时,答案会南下。Typescript可以是泛型的铁杆——浏览您过去的答案:)
// 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());