reactjs - Hvordan passer man HTML-attributter til et børne-
element ved hjælp af React og Typescript uden at få fejlen "IntrinsicAttributes & HTMLAttributes"?
Jeg har en funktionel React-komponent, der indpakker et image-element:
type BlobImageProps = HTMLAttributes<HTMLImageElement> & {
blobId: string
}
function BlobImage(props: BlobImageProps){
const {blobId, ...htmlAttributes} = props
const [objectUrl, setObjectUrl] = useState<string>()
// ...
// ... load image blob using effect hook
// ...
return <img {...htmlAttributes} src={objectUrl}/>
}
Og jeg bruger det sådan her:
function MyPage(){
//...
return (
<BlobImage blobId="xyz1234" alt="Funny cats"/>
)
}
Men jeg får en TypeScript-fejl, der siger
Type '{ blobId: string; alt: string; }' is not assignable to type 'IntrinsicAttributes & HTMLAttributes<HTMLImageElement> & { blobId: string; }'.
Property 'alt' does not exist on type 'IntrinsicAttributes & HTMLAttributes<HTMLImageElement> & { blobId: string; }'.
Hvad er der galt med min skrivning? Hvilken type skal BlobImageProps have?
Svar #1
Når man kigger gennem React-typernes definitioner,¹ ser det ud til, at du leder efter ImgHTMLAttributes<HTMLImageElement> i stedet for HTMLAttributes<HTMLImageElement>.
¹ Hvordan jeg gjorde det: Jeg indsatte din typedefinition i min editor, satte markøren på HTMLAttributes og bad den vise mig definitionen (F12 i mit tilfælde, VSCode). Det tog mig til index.d.ts for React (i @types/react i node_modules). Jeg bemærkede, at det interface ikke har alt (og bruger ikke sin typeparameter til noget, hvilket virker mærkeligt), så jeg søgte efter alt og fandt ImgHTMLAttributes.