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
相关产品推荐
相关产品推荐

