【发布时间】:2019-06-23 19:51:35
【问题描述】:
有了这个类方法
async openProject(
fileName: string,
force: boolean,
progress: boolean
) {
const response = await this.request({
type: 'request',
cmd: 'open_project',
payload: { value: fileName, force: force, progress: progress }
});
return {
id: response['payload']['project_id']
};
}
当我尝试访问响应时的有效负载属性时收到 TypeScript 警告:
[ts] 元素隐式具有“任何”类型,因为类型“{}”没有 索引签名。
我习惯于在函数调用中声明参数的类型。但是在这种情况下我应该如何声明响应的类型呢? this.requests 返回一个可以响应多种不同类型响应的 Promise。
我是否应该:
- 为每种类型的请求创建响应类型并
- 让
this.request返回所有响应类型的联合
编辑:
这是我在解决方案上的一次失败尝试
export type CreateProjectResponse = {
payload: {
project_id: string;
}
}
export type GetDevicesResponse = {
payload: {
devices: [];
}
}
export type GenericResponse = GetDevicesResponse | CreateProjectResponse;
request(body: any) {
const transactionId = this.newTransactionId();
const requestMessage = JSON.stringify({
...body,
trans_id: transactionId
});
if (this.logger) this.logger(requestMessage);
return new Promise<GenericResponse>((resolve, reject) => {
const timeoutTimer = setTimeout(() => {
const timeoutMessage = 'Request timed out';
if (this.logger) this.logger(timeoutMessage);
reject(Error(timeoutMessage));
}, this.maxTime);
this.requestCallbacks[transactionId] = {
resolver: resolve,
rejecter: reject,
timeoutTimer: timeoutTimer
};
this.socket.send(requestMessage);
});
}
async createProject() {
const response = await this.request({
type: 'request',
cmd: 'create_project',
}) ;
return {
id: response['payload']['project_id']
};
};
async getDevices() {
const response = await this.request({
type: 'request',
cmd: 'get_devices',
});
return response['payload']['devices'].filter((device: DeviceResponse) => {
return device['type'] === 'device';
}).map((device: DeviceResponse) => {
return {
id: device['device_id'],
name: device['name']
};
});
};
【问题讨论】:
标签: typescript