Reputation: 489
I am using react dropzone to upload multi-image in my simple application. For showing which type of images are drop for that I make a separate component with TypeScript. But Next.js image src is showing error like Type:
'{ src: string; alt: string; }' is not assignable to type 'IntrinsicAttributes & ImageProps'.
Type '{ src: string; alt: string; }' is not assignable to type 'ObjectImageProps'.
Types of property 'src' are incompatible.
Type 'string' is not assignable to type 'StaticImport'.
RenderFiles.ts:
import { IFile } from "../../libs/types";
import { sizeInMb } from "../../libs/sizeInMb";
import { FunctionComponent } from "react";
import Image from "next/image"
const RenderFile: FunctionComponent<{
file: IFile;
}> = ({ file: { formate, sizeInBytes, name } }) => {
return (
<div>
<Image src={`/images/${formate}.png`} alt="image"/>
<span>{name}</span>
<span>{sizeInMb(sizeInBytes)}</span>
</div>
);
};
export default RenderFile;
types.ts:
export interface IFile {
name: string;
sizeInBytes: number;
formate: string | number;
id?: string;
}
What is my mistake in src props?
Upvotes: 18
Views: 22781
Reputation: 170
For people that still have this issue, I had similar issue and I was using
<Image src={'image' as string} alt='Pic' />
You can try to import the StaticImageData type from "next/image"
Example:
import Image, {StaticImageData} from "next/image";
import image from "./pathImage"
...
<Image src = {image as StaticImageData}/>
Upvotes: 1
Reputation: 595
Importing the type for ImageLoaderProps
solved the issue for me.
Example:
import Image from 'next/image';
import type { ImageLoaderProps } from 'next/image';
const myLoader = ({ src, width, quality }: ImageLoaderProps) => {
return `https://example.com/?${src}?w=${width}&q=${quality}`;
};
export default function TestComponent(props: Record<string, string>) {
const { imageResource } = props;
return (
<Image
loader={myLoader}
src={`/${imageResource}`}
width="20%"
height="20%"
/>
);
}
Upvotes: 8
Reputation: 49
Just cast string as a any
<Image src={'string' as any} alt='Pic' />
Upvotes: -2
Reputation: 10717
I omitted placeholder
, blurDataURL
and layout
. I also made explicity src
as string. More info on this issue: https://github.com/vercel/next.js/issues/26735
Upvotes: -1
Reputation: 8370
The issue is next/image
's Image
is expecting rather complex type ImageProps
as it's props:
type StringImageProps = {
src: string
} & (
| { width?: never; height?: never; layout: 'fill' }
| {
width: number | string
height: number | string
layout?: Exclude<LayoutValue, 'fill'>
}
) &
(
| {
placeholder?: Exclude<PlaceholderValue, 'blur'>
blurDataURL?: never
}
| { placeholder: 'blur'; blurDataURL: string }
)
type ObjectImageProps = {
src: StaticImport
width?: number | string
height?: number | string
layout?: LayoutValue
placeholder?: PlaceholderValue
blurDataURL?: never
}
export type ImageProps = Omit<
JSX.IntrinsicElements['img'],
'src' | 'srcSet' | 'ref' | 'width' | 'height' | 'loading' | 'style'
> & {
loader?: ImageLoader
quality?: number | string
priority?: boolean
loading?: LoadingValue
unoptimized?: boolean
objectFit?: ImgElementStyle['objectFit']
objectPosition?: ImgElementStyle['objectPosition']
} & (StringImageProps | ObjectImageProps)
Since you're not importing image from local imports the only structure you're left is StringImageProps
. To conform to it you have to provide one of the following props sets:
<Image src={string} layout="fill" />
// or
<Image src={string} width={number} height={number} /> // with optional `layout` prop but not of type 'fill'
both variants may be extended with optional placeholder
(not of type 'blur') or required placeholder: 'blur'
and blurDataURL: string
.
And only after that you may provide native image
's attributes as alt
.
Upvotes: 15