网站搜索

reactjs - Typescript -> 在一个 React Native 项目中,‘value’ 的类型是 ‘unknown’。


我正在将一个 JS 文件转换为 TS,在我的 React Native 项目中,但遇到了一个无法解决的问题,即 value['flag'] 显示以下错误,'value' 的类型是 'unknown'.ts(18046)。对于如何解决这个问题的任何建议都将不胜感激。

代码块如下:

    for (const [key, value] of Object.entries(orderedCities)) {
      if (
        key.startsWith(userInput.toLowerCase()) &&
        userInput != '' &&
        value !== typeof undefined
      ) {
        const inputObject = {city: '', flag: ''};
        inputObject.city = key;
        inputObject.flag = value['flag'];
        creationArray.push(inputObject);
        setElementArray(creationArray);
      }
    }

我尝试在 const [key, value] 中声明一个类型,但这触发了一个不同的错误,我添加了 value !== typeof undefined,但是这并没有改变显示的错误。

答案#1

你期望 value 是一个具有属性 { flag: string } 的对象。目前整个 value 的类型是 unknown。甚至不知道它是否是一个 object。

这意味着你的orderedCities变量的类型有问题。也就是说,问题出在你代码的更高层次。

也许你在没有声明类型的情况下初始化了一个空字典。如果我按照以下方式创建 orderedCities,我可以重现你的 'value' 的类型为 'unknown' 错误:

const orderedCities = {};

我可以通过使用合适的类型创建 orderedCities 来消除错误:

const orderedCities: Record<string, { flag: string }> = {};

你会想要移除你尝试的解决方案 && value !== typeof undefined。这没有意义,因为 typeof undefined 是一个 string。一旦你在 orderedCities 上有了正确的类型,它本身会给你一个错误。


已更正的代码:

// Dummy variables with correct types to avoid errors
const creationArray: Array<{ city: string; flag: string }> = [];
const setElementArray: (array: Array<{ city: string; flag: string }>) => void = () => { };
const userInput = '';

// THIS IS THE TYPE WHICH MATTERS
const orderedCities: Record<string, { flag: string }> = {};

// No errors in your code
for (const [key, value] of Object.entries(orderedCities)) {
    if (
        key.startsWith(userInput.toLowerCase()) &&
        userInput != ''
    ) {
        const inputObject = { city: '', flag: '' };
        inputObject.city = key;
        inputObject.flag = value['flag'];
        creationArray.push(inputObject);
        setElementArray(creationArray);
    }
}

TS 演示链接

答案#2

当你想遍历对象时使用 for..in。

for (const key in orderedCities) {
  // const k = key as keyof typeof orderedCities
  // const value = orderedCities[k]
  // or
  const value = orderedCities[key as keyof typeof orderedCities]

  // ...
}