首页 > 解决方案 > 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于在 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]下出现如下错误:

元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“数据”。在“数据”类型上找不到具有“字符串”类型参数的索引签名。

我发现了许多关于此特定错误的结果,但无法应用在这种情况下有效的结果。任何帮助,将不胜感激。

标签: javascripttypescript

解决方案


您的代码有两个问题。首先,您要迭代的属性不在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('&');
}

TS游乐场


推荐阅读