javascript - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于在 Object.keys 中进行索引
问题描述
嗨,我是 TypeScript 的完整初学者。我在将基本站点转换为 TS 方面取得了一些成功,但被困在最后一个错误上。
interface Data {
data: Options;
}
interface Options {
name: string;
email: string;
message: string;
}
function encode(data: Data) {
return Object.keys(data)
.map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
.join('&');
}
数据是一个对象,名称:'',电子邮件:'' 和消息:''。
data[key]下出现如下错误:
元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“数据”。在“数据”类型上找不到具有“字符串”类型参数的索引签名。
我发现了许多关于此特定错误的结果,但无法应用在这种情况下有效的结果。任何帮助,将不胜感激。
解决方案
您的代码有两个问题。首先,您要迭代的属性不在Data
,它们在Options
。所以最后你必须使用data.data[key]
,而不是data[key]
.
另一个问题是更常见的问题。Object.keys
返回一个 s 数组String
。映射这些并将它们用作任何属性data.data[key]
都会导致错误,因为 TS 不确定是否key
是 的属性Options
(不是每个字符串都是正确的?)只有一些特定的字符串是Options
. 为此,您将不得不使用中间变量并对其进行类型转换。
function encode(data: Data) {
let objKeys = Object.keys(data) as Array<keyof Options>
return objKeys.map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(data.data[key]))
.join('&');
}
推荐阅读
- javascript - 获取 Youtube 视频格式
- python - Django 2.1 链接作为 DjangoAdmin 列表中的字段
- javascript - jQuery load() 函数没有像预期的那样工作
- mysql - 查找一个月中具有最大数据值的特定日期(每组 2 倍最大 n)
- jquery - slideDown/slideUp 和旋转图像
- hyperledger-composer - Hyperledger Composer 中的交易返回类型
- c# - 使用 reader 从表中查询数据
- python - 来自现有节点的networkx中的网络生成器
- excel - 在 Mac 上使用 MSXML.ServerXMLHTTP 的 VBA 中的 Web 服务
- three.js - 不同显示器上的不同点大小