Angular访问Record<string,bavparam>类型字典子属性报错问题咨询
问题原因分析
- 首先
Record<string, bavparam>的类型定义仅约束「Params对象的键为字符串、对应值必须符合bavparam接口结构」,不会自动帮你初始化每个键对应的bavparam实例。你在代码中先执行了t.qparams.Params = {},此时这个空对象中不存在OwnerLabel这个键,直接访问它的SearchBody属性自然会报undefined错误。 - 之前使用
Record<string, any>时你的写法是t.qparams.Params["OwnerLabel"] = filters["OwnerLabel"],相当于直接给OwnerLabel键赋值,不存在先访问undefined值的子属性的操作,因此可以正常运行。本次报错和类型定义本身没有关系,是你调整后的赋值逻辑存在访问未初始化属性的问题。
修复方案
你可以选择以下任意一种写法解决问题:
- 直接完整初始化bavparam对象再赋值给对应键
t.qparams.Params["OwnerLabel"] = { SearchBody: filters["OwnerLabel"], Tp: 1, Op: 1 };
- 先初始化对应键的空结构,再逐个修改属性
// 先初始化该键对应的bavparam对象 t.qparams.Params["OwnerLabel"] = {} as bavparam; // 再逐个赋值子属性 t.qparams.Params["OwnerLabel"].SearchBody = filters["OwnerLabel"]; t.qparams.Params["OwnerLabel"].Tp = 1; t.qparams.Params["OwnerLabel"].Op = 1;
- 如果有大量筛选字段需要统一配置Op和Tp,可以用批量逻辑简化代码
const defaultOp = 1; const defaultTp = 1; Object.keys(filters).forEach(filterKey => { t.qparams.Params[filterKey] = { SearchBody: filters[filterKey], Op: defaultOp, Tp: defaultTp } })
内容的提问来源于stack exchange,提问作者Kal800
相关产品推荐
相关产品推荐

