Не могу передать аргумент `forEach` - PullRequest
0 голосов
/ 29 января 2020

Я хотел бы спросить, почему компилятор не позволяет мне использовать функцию обратного вызова для forEach, хотя, насколько я знаю, "a" | "b" | "c" | "d" является подтипом string. Пожалуйста, проверьте сообщение об ошибке после блока кода. Я думаю, я мог бы решить эту проблему с типом Record, правильно? Спасибо!

const obj = { a: 10, b: 20, c: 30, d: 40 }
type O = typeof obj

Object.keys(obj).forEach((value: keyof O) => {
  console.log(value)
})

ошибка TS2345: Аргумент типа '(значение: "a" | "b" | "c" | "d") => void' нельзя назначить параметр типа '(значение: строка, индекс: число, массив: строка []) => void'.
Типы параметров "значение" и "значение" несовместимы.
Тип "строка" не может быть назначен набрать "а" | "б" | "c" | "d" '.

1 Ответ

1 голос
/ 29 января 2020

Мне удалось заставить это работать:

(Object.keys(obj) as (keyof O)[]).forEach((value: keyof O) => {
  console.log(value)
})

Проблема связана с Object.keys, который вернет string[], несмотря ни на что.

Использование этого метода isn правда не безопасно; когда я это проверял, компилятор не смог определить, действительно ли у obj есть ключи, которые соответствуют keyof O

...