You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript使用Object.keys遍历对象时字符串无法索引类型报错如何解决

报错原因

Object.keys() 方法的默认返回类型是string[],TypeScript无法确认返回的字符串都是目标接口的合法属性名,所以用字符串类型的变量索引固定结构的接口时就会触发该报错。
另外你当前代码还存在参数类型和实际传入值不匹配的问题:你定义的encode函数入参是Data类型(仅包含一个data属性,值为Options类型),但你描述实际传入的是直接带name/email/message三个属性的对象,需要先对齐参数类型再修复索引报错。

推荐解决方案(最安全,保留完整类型校验)

如果你实际要序列化的就是带name/email/message的对象,直接修改参数类型并对Object.keys的返回值做类型断言即可:

interface Options {
    name: string;
    email: string;
    message: string;
}

function encode(data: Options) {
    // 把key的类型断言为Options的合法属性组成的数组
    return  (Object.keys(data) as Array<keyof Options>)
            .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
            .join('&');
}

特殊场景适配

如果你确实需要处理外层包了data字段的Data类型对象,调整代码如下即可:

interface Data {
    data: Options;
}

interface Options {
    name: string;
    email: string;
    message: string;
}

function encode(data: Data) {
    const targetData = data.data;
    return  (Object.keys(targetData) as Array<keyof Options>)
            .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(targetData[key]))
            .join('&');
}

替代方案(不推荐,会丢失类型校验能力)

你也可以给接口添加字符串索引签名解决报错,但是后续给接口新增属性时会失去类型校验,不建议使用:

interface Options {
    name: string;
    email: string;
    message: string;
    // 声明所有字符串类型的键对应的值都是string
    [key: string]: string;
}

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:06:02