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

TypeScript动态键类型创建报错,求错误原因及解决方法

TypeScript 动态对象类型定义错误解析与修复

错误1:'_chosen' of type 'boolean' is not assignable to 'string' index type '{ chosen: boolean; }'

原因

注:错误信息中的chosen应为笔误,实际对应代码中的_chosen。

当你定义字符串索引签名[fieldName: string]: { _chosen: boolean }时,TypeScript要求对象中所有属性的类型必须匹配该索引签名的类型。但你同时定义了_chosen: boolean这个显式属性,它的类型boolean和索引签名要求的{ _chosen: boolean }类型不兼容,因此触发错误。


错误2:Property or signature expected. (when adding "[fieldname: string]" as optional(?:))

原因

TypeScript的索引签名不支持用?:标记为“可选”。因为索引签名本身的语义就是“允许存在0个或多个符合该规则的属性”,可选的含义已经内置其中,不需要额外添加?:。


错误3:'boolean' only refers to a type, but is being used as a value here.

原因

如果你的代码中确实是_chosen: boolean;(小写类型关键字),这个错误是前两个语法/类型不兼容错误导致的连锁误报,修复前两个问题后即可消除。若实际代码中写的是_chosen: Boolean(大写构造函数),则是混淆了类型关键字与值类型,需改为小写boolean。


正确的类型定义

根据你的示例数据,我们需要定义一个:

  • 外层为任意字符串键,对应值为内部对象
  • 内部对象必须包含_chosen: boolean属性,同时可包含任意数量的字符串键,对应值为含_chosen: boolean的子对象

写法一:索引签名覆盖所有属性

type TObjectsFieldsMap = {
  [objectName: string]: {
    _chosen: boolean;
    // 索引签名类型包含显式属性的boolean和子对象类型
    [fieldName: string]: boolean | { _chosen: boolean };
  };
};

写法二:交叉类型(更清晰)

// 定义内部对象类型:固定属性 + 任意子字段
type ObjectInner = {
  _chosen: boolean;
} & Record<string, { _chosen: boolean }>;

// 外层对象类型
type TObjectsFieldsMap = Record<string, ObjectInner>;

验证示例数据

将你的示例数据代入上述类型,TypeScript会正确通过类型检查:

const exampleData: TObjectsFieldsMap = {
  dynamicObj1: {
    _chosen: true,
    dyanmicField11: {
       _chosen: false
    },
    dyanmicField12: {
       _chosen: true
    }
  },
  dynamicObj2: {
    _chosen: false,
    dyanmicField21: {
       _chosen: false
    }
  },
  dynamicObj3: {
    _chosen: false,
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:45:35