我试图获取一个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());
答案 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);
的类型,因为您不能仅合并任何请求数组。