Как проверить тип объекта в реакции?

В моем коде у меня есть два интерфейса, как показано ниже.

export interface Temp{
    message : string
}
export interface Temp1{
    message1 : string
}

С таким кодом useMutation(....) отправляет запрос на сервер и запрашивает результат.

const {mutate, isLoading, data} = useMutation(authRepository.Login, {
    onSuccess: (value: Temp | Temp1) => {
        if (value instanceof Temp){
            
        }
    }
});

получить ошибку

'Temp' only represents a type, but here it is corrupted by value.

Мне любопытен простой способ проверить Temp и Temp1

Когда вы создаете тип с ключевыми словами type или interface в typescript, они полностью удаляются после компиляции. Скомпилированный JavaScript не имеет понятия об этих вещах. Вы можете использовать instanceof с экземплярами, созданными из классов. В противном случае вам придется подумать о том, как бы вы поступили на простом JavaScript.

ShamPooSham 02.04.2023 09:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
143
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема с вашим кодом в том, что вы используете instanceof с интерфейсом.

Оператор instanceof проверяет, является ли класс экземпляром класса, поэтому у вас возникает эта ошибка.

Возможно, вы можете изменить свои интерфейсы на классы или просто сделать некоторые реализации своих интерфейсов.

class TempImpl implements Temp {
  constructor(public message: string) {}
}

class Temp1Impl implements Temp1 {
  constructor(public message1: string) {}
}
Ответ принят как подходящий

Тип защиты

Как насчет создания небольшой функции для определения интерфейса.

const isTemp1 = (value: Temp | Temp1): value is Temp1 => {
  return "message1" in value;
};

И теперь вы можете использовать значение интерфейса Temp1 в предложении if.

    const handleSubmit = (tem: Temp| Temp1)=> {
        if (isTemp1(tem)){
            console.info(tem)
        }
    }

скриншот vscode

Ссылка

Я думаю, что следующие вопросы будут полезны

Проверка типа интерфейса с помощью Typescript

В этом случае тип ответа обычно Temp|Temp1, но не всегда (например, изменения сервера, проблемы с сетью...)

вам может понадобиться какой-нибудь валидатор, например zod, чтобы убедиться, что содержимое объекта действительно Temp1:

import { z } from "zod"

const temp1Schema = z.object({
    message1: z.string()
}) satisfies z.ZodType<Temp1>

function onSuccess(value: unknown) {
    const result = temp1Schema.safeParse(value)
    if (result.success) {
        result.data // Temp1
    }
}

Формат satisfies — это просто мое предпочтение, это также можно сделать, сначала создав схему и используя схему для вывода type:

type Temp1 = z.infer<typeof temp1Schema>

Другие вопросы по теме