React Native项目JS转TS:'value'为unknown类型的错误解决问询
解决TypeScript中
value['flag']提示'value' is of type 'unknown'的问题 问题根源
TypeScript对未声明类型的对象,调用Object.entries()时会把值的类型推断为unknown,所以直接访问value['flag']会触发类型错误。另外你写的value !== typeof undefined是无效判断——typeof undefined返回的是字符串'undefined',这个条件实际是在判断value是否不等于字符串'undefined',根本没起到排除undefined的作用。
具体解决思路
1. 给orderedCities声明完整类型(推荐)
这是最规范的做法,从根源上让TypeScript正确推断类型:
// 先定义城市对象的类型 interface CityItem { flag: string; // 城市对象如果有其他属性,也在这里补充 } // 给orderedCities指定类型 const orderedCities: Record<string, CityItem> = { // 你的原始对象内容 }; // 之后循环里的value会自动被推断为CityItem类型 for (const [key, value] of Object.entries(orderedCities)) { if ( key.startsWith(userInput.toLowerCase()) && userInput !== '' && value !== undefined // 这里修正判断逻辑 ) { const inputObject = { city: '', flag: '' }; inputObject.city = key; inputObject.flag = value['flag']; // 不再报错 creationArray.push(inputObject); setElementArray(creationArray); } }
2. 临时使用类型断言
如果暂时不想给整个对象声明类型,可以给value做类型断言(注意:要确保value确实包含flag属性,避免运行时错误):
for (const [key, value] of Object.entries(orderedCities)) { if ( key.startsWith(userInput.toLowerCase()) && userInput !== '' && value !== undefined ) { const inputObject = { city: '', flag: '' }; inputObject.city = key; // 断言value是包含flag属性的对象 inputObject.flag = (value as { flag: string })['flag']; creationArray.push(inputObject); setElementArray(creationArray); } }
3. 使用类型守卫做安全判断
如果不确定value是否一定有flag属性,可以写个类型守卫函数做安全校验:
// 定义类型守卫函数 function isCityItem(value: unknown): value is { flag: string } { return typeof value === 'object' && value !== null && 'flag' in value; } for (const [key, value] of Object.entries(orderedCities)) { if ( key.startsWith(userInput.toLowerCase()) && userInput !== '' && isCityItem(value) // 这里用类型守卫判断 ) { const inputObject = { city: '', flag: '' }; inputObject.city = key; inputObject.flag = value['flag']; // TypeScript会自动推断类型 creationArray.push(inputObject); setElementArray(creationArray); } }
内容的提问来源于stack exchange,提问作者James Hibbeard
相关产品推荐
相关产品推荐

