首页 > 解决方案 > TypeScript,没有带有“字符串”类型参数的索引签名

问题描述

我正在尝试使用写在数组中的一些字段顺序规则来订购一个对象:

这是订单规则:

const fieldsOrder = [
  'agentID',
  'agentSequence',
  'token'
];

这是需要订购的对象:

const request = {
  token: 'TEST',
  agentSequence: true,
  agentID: '40208697',
}

所以我的想法是这样做:

const feeLookupRequest = {};

for(const field of fieldsOrder) {
  if (request[field]) {
    feeLookupRequest[field] = request[field]; // ERROR
  }
}

它有效,我可以制作一个console.log(feeLookupRequest)显示:

{
  agentID: '40208697',
  agentSequence: true,
  token: 'TEST'
}

但是我遇到了一些我不太了解的类型错误:

TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used
to index type '{}'.   No index signature with a parameter of type 'string' was found on type '{}'.

有什么提示吗?

编辑:实际上,如果我发送agentSequence: falsefeeLookupRequest对象没有agentSequence属性,我不知道我该如何管理它。

测试代码:

https://jsfiddle.net/pmiranda/7n4qd12t/

标签: javascripttypescript

解决方案


首先,您不应该期望对象上有特定顺序的键。这就是为什么尝试对它们进行排序不是一个最佳主意。

从错误开始,您应该指出requestfeeLookupRequest具有索引

const fieldsOrder = [
    'agentID',
    'agentSequence',
    'token'
];

const request: Record<string, any> = {
    token: 'TEST',
    agentSequence: '7',
    agentID: '40208697',
};

const feeLookupRequest: Record<string, any> = {};

for (const field of fieldsOrder) {
    if (request[field]) {
        feeLookupRequest[field] = request[field]; // ERROR
    }
}

推荐阅读