TypeScript字符串索引对象报错的函数修正方案咨询
解决TypeScript字符串索引的"any"类型错误
下面是几种简洁的修正方案,无需嵌套冗余代码:
方案1:类型守卫判断(安全且直观)
用in操作符做类型守卫,让TypeScript自动窄化类型,消除错误:
const allowedValues = { val1: ["x","y"], val2: ["1","2"], }; const getOptions = (fieldName: string) => { return fieldName in allowedValues ? allowedValues[fieldName] : ["k","i"]; };
fieldName in allowedValues会触发TypeScript的类型推断,自动识别allowedValues[fieldName]为对应字符串数组类型,既解决了"any"错误,又保留函数接收任意字符串参数的能力。
方案2:类型断言+空值合并(代码最紧凑)
如果追求代码简短,用类型断言结合空值合并运算符:
const allowedValues = { val1: ["x","y"], val2: ["1","2"], }; const getOptions = (fieldName: string) => { return allowedValues[fieldName as keyof typeof allowedValues] ?? ["k","i"]; };
这里的类型断言告诉TypeScript把传入的字符串当作allowedValues的有效键处理,即使传了非预设键,??会兜底返回预设数组,兼顾类型安全和代码简洁。
方案3:添加索引签名(适合动态键场景)
如果allowedValues后续需要动态添加键,直接给它定义字符串索引签名:
const allowedValues: { [key: string]: string[] } = { val1: ["x","y"], val2: ["1","2"], }; const getOptions = (fieldName: string) => { return allowedValues[fieldName] || ["k","i"]; };
这种方式直接明确所有键对应字符串数组类型,TypeScript不会再报错,但会丢失具体键的强类型信息,适合不需要精确键类型的场景。
内容的提问来源于stack exchange,提问作者Jorge Kageyama
相关产品推荐
相关产品推荐

