Как я могу получить доступ к полю массива объекта в TypeScript? Тип 'unknown' должен иметь метод '[Symbol.iterator]()', который возвращает итератор

У меня есть вспомогательная функция, которая обновляет форму на основе имени поля, например. если имя, то будет обновлено form.name. Если user[0].name, то будет обновлено имя индекса 0 формы.users. Однако я столкнулся с ошибкой, и она упрощается с помощью приведенного ниже кода:

const example: Record<string, unknown> = {
    'a': 'haha',
    'b': [1,2,3],
};
const str = 'b.haha';
const tokens: string[] = str.split(".");
if (typeof example[tokens[0]][Symbol.iterator] === 'function') {
    const c = [...example[tokens[0]];
}

детская площадка

Я не могу решить этот тип. «Неизвестный» должен иметь метод «Symbol.iterator», который возвращает итератор. Спасибо

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что вы установили второй общий аргумент Record в unknown. В вашем случае вы, вероятно, хотите, чтобы вместо этого было any:

const example: Record<string, any> = { // <- change is in this line
    'a': 'haha',
    'b': [1,2,3],
};
const str = 'b.haha';
const tokens: string[] = str.split(".");

if (typeof example[tokens[0]][Symbol.iterator] === 'function') {
    const c = [...example[tokens[0]];
    console.info(c);
}

Детская площадка

Принципиальное различие между unknown и any IMO заключается в том, что вам нужно активно приводить переменные типа unknown, в то время как с переменными типа any можно делать что угодно. Это делает unknown немного более безопасным, поскольку вы получаете ошибки во время компиляции, если пытаетесь что-то сделать с переменной unknown, хотя код не знает, что находится в этой строке.

Лично я бы оставил unknown и фактически позволил машинописному тексту творить чудеса с тип гвардии, который автоматически преобразует c в any[]:

const example: Record<string, unknown> = {
    'a': 'haha',
    'b': [1,2,3],
};
const str = 'b.haha';
const tokens: string[] = str.split(".");

const value = example[tokens[0]];

if (Array.isArray(value)) {
    const c = [...value];
    console.info(c);
}

Детская площадка

Возможно, вы захотите прочитать документы о unknown и как это соотносится с any.

… и если Array.isArray недостаточно, так как вам действительно нужно работать с произвольными итерируемыми объектами, я бы написал это как это

Bergi 21.03.2022 14:25

Другие вопросы по теме