Задать вопрос
@timonck

Почему выбивает ошибку в функции?

У меня есть пара функций, в которых одинаковые ошибки:

TS2345: Argument of type 'Products | undefined' is not assignable to parameter of type 'Products'.   Type 'undefined' is not assignable to type 'Products'.


export type Products = {
    id: number,
    title: string,
    images: string[],
    currentImageIndex: number,
    isCycleMode: boolean,
    cantGoPrev: boolean,
    cantGoNext: boolean,
    price: number,
    company: string,
    info: string,
    inCart: boolean,
    count: number,
    total: number
}

getItem = (id: number) => {
        return this.state.products.find(item => item.id === id);
    };

    addToCart = (id: number) => {
        let tempProduct: Products[] = [...this.state.products];
                                                            //тут ошибка(this.getItem(id))
        const index = tempProduct.indexOf(this.getItem(id));
        const product = tempProduct[index];
        product.inCart = true;
        product.count = 1;
        const price = product.price;
        product.total = price;
        this.setState(
            () => {
                return {
                    products: tempProduct,
                    cart: [...this.state.cart, product]
                }
            }
            ,
            () => {
                this.addTotals();
            }
        );
    };

    increment = (id: number) => {
        let tempCart = [...this.state.cart];
        const selectedProduct = tempCart.find(item => item.id === id);
                                         // тут такая же ошибка  indexOf(selectedProduct)
        const index = tempCart.indexOf(selectedProduct);
        const product = tempCart[index];
        product.count = product.count + 1;
        product.total = product.count * product.price;
        this.setState(
            () => {
                return {
                    cart: [...tempCart]
                };
            },
            () => {
                this.addTotals();
            }
        );
    };
  • Вопрос задан
  • 128 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
@ned4ded
Верстка, Фронтенд
Добрый день.

Метод getItem возвращает либо Products, либо undefined, если продукт не найден. Сделайте терминальное условие и укажите строгую типизация для используемого массива далее.

addToCart = (id: number) => {
  let tempProduct: Products[] = [...this.state.products];
  const item = this.getItem(id);
  if(item === undefined) {
    // ... инструкция при возникновении терминального условия, например, ошибка
    return;
  }
  const index = tempProduct.indexOf(item as Products); // строгая типизация для item
        
  // ...
};


Возможно, если вы укажите тип возвращаемого значения, то не потребуется терминальное условие (но это нужно проверить, я так навскидку не могу утверждать со 100% уверенностью). Такой подход подвержен багам при исполнении js.

getItem = (id: number): Products => {
  return this.state.products.find(item => item.id === id);
};


BTW, я бы не стал называть на вашем месте тип Products во мн. ч. Просто Product, т.к. по сути это единичная сущность.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽