@kiberchainik
начинающий найкрутейшЫй програмЁр

Почему типизация видит в переменной undefined?

есть компонент
import { useEffect, useState } from "react"
import { useParams } from "react-router-dom"
import FullNewsComponent from "@/components/ui/fullNewsPage/FullNewsComponent"
import dfn from '../demoData/demoFullNews.json'
import { IFullNewsInterface } from "@/components/interfaces/FullNews.interface"

const FullNewsPage = () => {
  const [fullNewsData, setFullNewsData] = useState<IFullNewsInterface>()
  
  const {seo} = useParams()
  
  useEffect(() => {
    const newsdata = dfn.newsData.filter(data => data.seo === seo)
    setFullNewsData(newsdata[0] as IFullNewsInterface)
  }, [])
  console.log(fullNewsData);
  return (
    <>
        <FullNewsComponent {...fullNewsData} />
    </>
  )
}

export default FullNewsPage

выдается ошибка:
Тип "{ articleId?: number | undefined; category?: string | undefined; title?: string | undefined; seo?: string | undefined; authorData?: IUserShortData | undefined; fullText?: string | undefined; views?: number | undefined; comments?: number | undefined; publishedDate?: number | undefined; tags?: ITagsInterface[] | undef..." не может быть назначен для типа "IFullNewsInterface".
  Типы свойства "articleId" несовместимы.
    Тип "number | undefined" не может быть назначен для типа "number".
      Тип "undefined" не может быть назначен для типа "number".ts(2322)
(alias) const FullNewsComponent: (props: IFullNewsInterface) => JSX.Element
import FullNewsComponent
Reused component for rendering full article, news or blog page

в консоле при выводе в лог console.log(fullNewsData) undefined
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 2
Alexandroppolus
@Alexandroppolus
кодир
Классический пример, когда не нужна связка useState+useEffect

У тебя функция setFullNewsData вызывается только внутри useEffect. То есть "стейт" fullNewsData - никакой не стейт, а производное значение от квери-параметра seo. Соответственно его надо просто вычислять, скорее всего, с хуком useMemo. Впрочем, undefined при этом никуда не денется, но он совершенно по делу - неизвестно, что может быть в квери-параметре.

так что предложение проверять fullNewsData остается актуальным.
Ответ написан
Комментировать
@chemdev
Суммируя с информацией которую дал Kentavr16. Мгновенное решение:
...
return (
    <>
        { fullNewsData && <FullNewsComponent {...fullNewsData} />}
    </>
  )

Объяснение:

потому что изначально при первом рендере ты не задал значения для стейта, потому он и андефайнед.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы