Next.js Discord

Discord Forum

typescript error

Unanswered
Havana posted this in #help-forum
Open in Discord
HavanaOP
Hi,
I am struggling to pass two types of data to a reusable component without getting TypeScript errors. The reusable component is supposed to take a prop that has two different data types, but when I try to import both, I encounter an error.

19 Replies

HavanaOP
These are the types. Do you know how they will be rendered in the same component based on conditions? Basically, I tried different approaches, but none of them are working. If you know how this should work, please let me know.
HavanaOP
ok
'use client';
import { homeImageSliderData } from '../utility/homeImageSlider';
import Image from 'next/image';
import { useRef } from 'react';

// Import Swiper React components and styles
import 'swiper/css';
import 'swiper/css/navigation';
import { Swiper, SwiperSlide } from 'swiper/react';

// Import Swiper core and required modules
const HomeImageSlider = () => {
const swiperRef = useRef(null); // Create a ref for Swiper

return (
<div>
<div className="pl-3">
<h1 className="text-dark-blue font-semibold py-3">
Featured Attractions
</h1>
<Swiper
ref={swiperRef} // Attach ref to Swiper
slidesPerView={'auto'}
spaceBetween={30}
breakpoints={{
1: {
slidesPerView: 1,
spaceBetween: 20
},
768: {
slidesPerView: 2,
spaceBetween: 10
},
1100: {
slidesPerView: 3,
spaceBetween: 10
}
}}
>
{homeImageSliderData.map((ImageDetails) => (
<SwiperSlide
key={ImageDetails.id}
className="min-w-[80%] max-w-[80%]"
>
<Image
className="rounded-[15px]"
src={ImageDetails.url}
alt={ImageDetails.title}
width={500}
height={250}
/>
</SwiperSlide>
))}
</Swiper>
</div>
<div className="bg-light-purple py-1 mt-4"></div>
</div>
);
};

export default HomeImageSlider;
one type of data import * as z from 'zod';

// Define the image schema
const ImageSchema = z.object({
id: z.string(),
url: z.string().url(),
title: z.string(),
});

// Update the schema to allow an array of images directly
export const ImageSliderDataSchema = z.array(ImageSchema);

// Update the type inference
export type ImageSliderData = z.infer<typeof ImageSliderDataSchema>;
second type of data import * as z from 'zod';

// Schema for individual images
const ImageSchema = z.object({
url: z.string().url(),
title: z.string(),
});

// Schema for the main data structure
export const TrendingImageSliderDataSchema = z.object({
category: z.string(),
title: z.string(),
description: z.string(),
id: z.string(),
rating: z.number(),
reviews: z.number(),
price: z.number(),
image: ImageSchema, // Reference the ImageSchema for the image object
});

// Type inferred from the schema
export type TrendingImageSliderData = z.infer<typeof TrendingImageSliderDataSchema>;

// Example usage with an array of this schema
const TrendingImageSliderArraySchema = z.array(TrendingImageSliderDataSchema);

// Type inferred from the array schema
export type TrendingImageSliderDataArray = z.infer<typeof TrendingImageSliderArraySchema>;
Double-striped Thick-knee
@Havana are you struggling to render contents inside a reusable component with two different types of data or is there any error that I'm missing?
@Havana you understand correct
Double-striped Thick-knee
you can try adding a separate prop to make the condition simple,

"use client";

import React from "react";
import { ImageSliderData } from "./schema/schema1";
import { TrendingImageSliderDataArray } from "./schema/schema2";

type PropsSimple = {
    sliderData: ImageSliderData;
    isSimple: true;
};

type PropsComplex = {
    sliderData: TrendingImageSliderDataArray;
    isSimple: false;
};

export default function ReusableComponent(props: PropsComplex | PropsSimple) {
    if (props.isSimple) {
        // props.sliderData[0].id;
        // props.sliderData[0].title;
        // props.sliderData[0].url;

        return <div>Render your simple slider</div>;
    }

    // props.sliderData[0].id;
    // props.sliderData[0].title;
    // props.sliderData[0].category;
    // props.sliderData[0].description;
    // props.sliderData[0].image;
    // props.sliderData[0].price;
    // props.sliderData[0].rating;
    // props.sliderData[0].reviews;

    // render complex slider
    return <div>Render your complex slider</div>;
}
HavanaOP
check now
here is what error says Type '{ category: string; title: string; description: string; id: string; rating: number; reviews: number; price: number; image: { title: string; url: string; }; } | { title: string; id: string; url: string; }' is not assignable to type 'HomeImageDetails'.
Property 'url' is missing in type '{ category: string; title: string; description: string; id: string; rating: number; reviews: number; price: number; image: { title: string; url: string; }; }' but required in type 'HomeImageDetails'.ts(2322)
HomeImageSlider.tsx(5, 3): 'url' is declared here.
HomeImageSlider.tsx(10, 62): The expected type comes from property 'imagesDetails' which is declared here on type 'IntrinsicAttributes & { imagesDetails: HomeImageDetails; }'
(property) imagesDetails: HomeImageDetails
No quick fixes available
@Havana check now
Double-striped Thick-knee
sliderData is a combination of two schemas. one of your schema has a url property but the other one is undefined.
export const TrendingImageSliderDataSchema = z.object({
    category: z.string(),
    title: z.string(),
    description: z.string(),
    id: z.string(),
    rating: z.number(),
    reviews: z.number(),
    price: z.number(),
    image: ImageSchema, // Reference the ImageSchema for the image object
});

<HomeImageSlider /> requires you to provide a url
Double-striped Thick-knee
you gotta make your HomeImageSlider component compatible with both data types
HavanaOP
but than there be error if every data type did not match, so I can only used data type that will perfect macth
@Havana but than there be error if every data type did not match, so I can only used data type that will perfect macth
Double-striped Thick-knee
if one of the schema mathes, there will be no error