В моем коде у меня есть два интерфейса, как показано ниже.
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
Проблема с вашим кодом в том, что вы используете 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)
}
}
Я думаю, что следующие вопросы будут полезны
В этом случае тип ответа обычно 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>
Когда вы создаете тип с ключевыми словами
type
илиinterface
в typescript, они полностью удаляются после компиляции. Скомпилированный JavaScript не имеет понятия об этих вещах. Вы можете использовать instanceof с экземплярами, созданными из классов. В противном случае вам придется подумать о том, как бы вы поступили на простом JavaScript.