@jeruthadam
Я крут

Почему Typescript показывает ошибку?

Начал изучать ТС, и не могу понять почему тут показывает ошибку?

const data: {
  hello: {
    wtf: string
  }
} = {
  hello: {
    wtf: 'world'
  }
}

for (const [key] of Object.entries(data)) {
  console.log(data[key]); // ошибка тут data[key]
}


Как получить доступ к свойству объекта без ошибки?
  • Вопрос задан
  • 189 просмотров
Решения вопроса 1
@ned4ded
Верстка, Фронтенд
Typescript показывает ошибку, потому что он типизирует любые ключи объекта, переданные в Object.keys и Object.entries, как строки (а не строковые константы). Это заложенное поведение. Причину называют разрабы следующую: "объект может иметь больше свойств во время рантайма, поэтому тип string[]" (тред1, тред2).

Доступ к свойству объекта без ошибки в данном случае можно получить только если задать типизацию самостоятельно.

Самое простое решение:
const data: {
    hello: {
        wtf: string;
    };
} = {
    hello: {
        wtf: 'world',
    },
};

for (const [key] of Object.entries(data) as [keyof typeof data, any][]) {
    console.log(data[key]); 
}


Читабельность такого кода, конечно, сильно страдает. Более подходящий вариант:
interface Data {
    hello: {
        wtf: string;
    };
}

type DataKey = keyof Data;

const data: Data = {
    hello: {
        wtf: 'world',
    },
};

for (const [key] of Object.entries(data) as [DataKey, any][]) {
    console.log(data[key]);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы