@timofeus91
Junior Frontend Developer

Как правильно поставить тип параметру?

Всем доброго времени суток! Делаю универсальную функцию по изменению булева значения в объекте, который является частью массива.

export type TodoListArrayType = Array<{
    id: number,
    subtitle: string,
    important: boolean,
    done: boolean,
}>

const generalToggle = (arr: TodoListArrayType, id: number, propertyName: any) => {
        const idx = arr.findIndex((item) => item.id === id);
        const oldItem = arr[idx];
        const value = !oldItem.propertyName;

        const item = {...arr[idx], [propertyName]: value};
        return [
            ...arr.slice(0, idx),
            item,
            ...arr.slice(idx + 1)
        ];
    };


Возникает ошибка со значением propertyName.


TS2339: Property 'propertyName' does not exist on type '{ id: number; subtitle: string; important: boolean; done: boolean; }'.


я точно знаю что propertyName будет либо important либо done из типа TodoListArrayType . Но я никак не могу найти информации ( или правильно ее понять ) как передать эту информацию в коде. Подскажите, пожалуйста, как правильно передать тип для propertyName.
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
interface TodoItem {
    id: number
    subtitle: string
    important: boolean
    done: boolean
}

const generalToggle = (arr: TodoItem[], id: number, propertyName: keyof TodoItem) => {
        const idx = arr.findIndex((item) => item.id === id);
        const oldItem = arr[idx];
        const value = !oldItem[propertyName];

        const item = {...arr[idx], [propertyName]: value};
        return [
            ...arr.slice(0, idx),
            item,
            ...arr.slice(idx + 1)
        ];
    };


А еще лучше, храните TODO объектом по ключам (для мутаций) и отдельно список IDs (для рендера списка), чтобы O(n) не гонять на каждое изменение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@r_zaycev
Все правильно ругается, потому что поля `propertyName` действительно нет в TodoListArrayType и у вас в коде ошибка

Обращаться нужно как `oldItem[proprtyName]`. Но не факт, что на это линтер не будет ругаться
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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