typescript - 数组中的打字稿泛型类型丢失
问题描述
我正在尝试获取一个 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());
解决方案
您正在使用 Sequence.requests
which 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
,因为您不能只合并任何请求数组。
推荐阅读
- python - Django:在保存前修改模型的字段
- java - 我写了两段代码,几乎一模一样,但一个运行得比另一个快得多(Java)
- php - PHP中用户创建的列表?
- camera - 流式 html5 相机输出
- javascript - ES6:根据另一个数组的值从一个数组中获取值
- arrays - 将对象推送到数组数组vue重新渲染失败
- python - 按值拆分列表的快速方法?
- javascript - 如果变量类型没有由 var、let 或 const 初始化,或者仍然分配给数字类型,为什么它总是“字符串”?
- swiftui - SwiftUI:.sheet() 在关闭当前工作表时不会使用预期数据转到上一个视图
- python - python3上的打印语句不再登录谷歌云平台