reactjs Typescript ->“value”的类型为“unknown”,在React Native项目中

xdnvmnnf  于 2022-12-18  发布在  React
关注(0)|答案(3)|浏览(214)

我正在转换一个JS文件到TS,在我的React原生项目,但偶然发现这个问题,我不能解决的地方value['flag']显示以下错误,'值'是类型'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,但这没有改变显示的错误。

ujv3wf0j

ujv3wf0j1#

当你想迭代对象时,使用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]

  // ...
}
6ojccjat

6ojccjat2#

你期望value是一个属性为{ flag: string }的对象。现在整个value的类型为unknown。它甚至不知道它是一个object
这意味着**orderedCities变量的类型有问题**,也就是说,问题出在代码的更高层次。
也许你初始化了一个空字典而没有声明它的类型。如果我把orderedCities创建为:

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);
    }
}


TSPlayground链接

56lgkhnf

56lgkhnf3#

value转换为city类型,假设它名为ICity

for (const [key, value] of Object.entries(orderedCities)) {
  const typedValue = value as ICityObjectType;
  /** use typedValue instead of value */
}

相关问题