Typescript для в l oop, итерации по типу объединения объекта или массива - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь использовать for in loop для типа объединения объекта или массива, поскольку массивы также являются объектами, а их ключевое свойство является индексом.

const loopOver = (question: [] | {[key: string]: any} ) => {
  for (let key in question) { // error ts 7053
    console.log(question[key])
  }
};

приводит к ошибке

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ [key: string]: any; } | []'.
  No index signature with a parameter of type 'string' was found on type '{ [key: string]: any; } | []'.ts(7053)

но как только я удаляю тип объединения и оставляю его объекту или массиву, я не получаю никаких ошибок.

// okay
const loopOver = (question: {[key: string]: any} ) => {
  for (let key in question) {
    console.log(question[key])
  }
};
// okay
const loopOver = (question: [] ) => {
  for (let key in question) { 
    console.log(question[key])
  }
};

tsconfig

{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve"
  },
  "exclude": ["node_modules"],
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
}

ts версия в упаковке. json ^3.8.3

1 Ответ

0 голосов
/ 12 апреля 2020

Массивы должны индексироваться числами , а не строками. Но for..in повторяет строки - ваш key является строкой. При поиске свойств в массиве приведите строковый ключ к числу, чтобы он работал. (Но при поиске свойства объекта, так как объект использует [key: string]: any, вы должны продолжать искать, используя строку)

const loopOver = (question: [] | {[key: string]: any} ) => {
  for (let key in question) {
    if (Array.isArray(question)) {
      console.log(question[Number(key)])
    } else {
      console.log(question[key])
    }
  }
};

Но из этого кода, похоже, вы не на самом деле это вообще не заботит ключи (и for..in не следует использовать в любом случае с массивами). Вы заботитесь только о значениях, так как насчет использования Object.values вместо?

const loopOver = (question: [] | {[key: string]: any} ) => {
  for (const val of Object.values(question)) {
    console.log(val)
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...