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

Почему typescript считает, что свойств data и error, от rtk query из redux toolkit, не существуют?

Есть у меня функция под названием "urlShortener", для отправки данных на мой сервер:
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const linkApi = createApi({
  reducerPath: 'linkApi',
  baseQuery: fetchBaseQuery({ baseUrl: 'http://localhost:8000' }),
  endpoints: (build) => ({
    urlShortener: build.mutation<string, string>({
      query: (originalUrl) => ({
        url: '/links',
        body: {
          originalUrl: originalUrl
        },
        method: 'POST'
      })
    }),
    getOriginalUrl: build.mutation<string, string>({
      query: (shortenUrl) => ({
        url: '/' + shortenUrl,
        method: 'GET'
      })
    })
  })
})

Сервер возвращает такие данные при успешном запросе:
638498cf0d670558457667.png
Вот такие данные, например если что-то не так с сервером:
jxnwub9bqb1vnb8jbkcu57jpthi.png
И такие данные, если с сервером все в порядке, но что-то не так с запросом:
638499cfc5b79996733764.png
Но проблема в том, что когда я пытаюсь получить одни из этих данных и использовать их
const linkShortenerHandler = () => {
    linkShortener(url).then(res => {
      if (res.error) {
        if (res.error.data) {
          setError(res.error.data)
        } else if (res.error.message) {
          setError(res.error.message)
        }
      } else if (res.data) {
        setResponseContent(res.data)
      }
    })
  }

Происходит ошибка:
4uq1ms4gf2miutewoorewhpwgyc.png
В чем проблема?
  • Вопрос задан
  • 1295 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
@true_k
frontend developer
Тип возвращаемого значения функцией linkShortener определяет два разных результата работы функции. Typescript не знает с чем мы работаем. С объектом в котором data или с объектом в котором error. По этому нам самим нужно сузить тип, в TS это называется Narrowing https://www.typescriptlang.org/docs/handbook/2/nar.... Если в кратце то тебе нужно убедится что error или data присутствуют в объекте.
const linkShortenerHandler = () => {
    linkShortener(url).then(res => {
      if ("error" in res.error && res.error) {
        if (res.error.data) {
          setError(res.error.data)
        } else if (res.error.message) {
          setError(res.error.message)
        }
      } else if ("data" in res.data && res.data) {
        setResponseContent(res.data)
      }
    })
  }

Нужно учесть что конструкция "bar" in foo возвращает true в случае если свойство существует в объекте игнорируя его значение.
const foo = {
  bar: "some value",
  bar1: null,
  bar2: undefined,
}

console.log("bar" in foo) // true
console.log("bar1" in foo) // true
console.log("bar2" in foo) //true
console.log("bar3" in foo) //false
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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