У меня есть вспомогательная функция, которая обновляет форму на основе имени поля, например. если имя, то будет обновлено 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», который возвращает итератор. Спасибо
Ваша проблема в том, что вы установили второй общий аргумент 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
недостаточно, так как вам действительно нужно работать с произвольными итерируемыми объектами, я бы написал это как это