reactjs - Správne rozširovanie vlastností komponentu na predvolené vlastnosti HTML tlačidla
Pracujem na komponente tlačidla, ktorá má vlastnosť variant, aby sa určila jej farba. Tu je zjednodušená verzia
interface Props extends React.HTMLProps<HTMLButtonElement> {
variant: 'yellow' | 'green';
}
function Button({ variant, ...props }: Props) {
console.log(variant);
return (
<button
type="button"
{...props}
/>
);
}
Dostávam chybu TypeScript pod mojím type, ktorá hovorí:
(JSX atribút) ButtonHTMLAttributes.type?: „button“ | „submit“ | „reset“ | undefined Typ 'string' nie je priraditeľný k typu '„button“ | „submit“ | „reset“ | undefined'.ts(2322) index.d.ts(1872, 9): Očakávaný typ pochádza z vlastnosti 'type', ktorá je tu deklarovaná na type 'DetailedHTMLProps, HTMLButtonElement>'
Takže si nie som istý, či správne rozširujem vlastnosti tlačidla? Možno je nejaký iný spôsob?
Odpoveď č. 1
Aktualizácia 2023
ak chcete vytvoriť tlačidlo bez akýchkoľvek extra vecí, môžete rozšíriť React.ComponentPropsWithoutRef<"button"> a pre ľudí, ktorí sa snažia vytvoriť opakovane použiteľnú komponentu, budete musieť forwardRef použiť na základný element a potom môžete použiť ComponentPropsWithRef:
interface Props extends React.ComponentPropsWithoutRef<"button"> {
variant: 'yellow' | 'green';
}
prečo nepoužiť React.HTMLAttributes<HTMLButtonElement>?
toto sa stane, keď použijete:
export interface ButtonProps extends React.HTMLAttributes<HTMLButtonElement> {
/* etc */
}
function App() {
// Property 'type' does not exist on type 'IntrinsicAttributes & ButtonProps'
return <Button type="submit"> text </Button>;
}
Staré odpovede
Živá ukážka Codesandbox
pravdepodobne hľadáte React.HTMLAttributes<HTMLButtonElement>
import * as React from "react";
import { render } from "react-dom";
import "./styles.css";
interface Props extends React.HTMLAttributes<HTMLButtonElement> {
variant: 'yellow' | 'green';
}
function Button({ variant, ...props }: Props) {
return (
<button
type="button"
{...props}
/>
);
}
const rootElement = document.getElementById("root");
render(<Button variant='green' />, rootElement);
aby sme boli presnejší, môžeme použiť React.ButtonHTMLAttributes<HTMLButtonElement>
import * as React from "react";
import { render } from "react-dom";
import "./styles.css";
interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant: 'yellow' | 'green';
}
function Button({ variant, ...props }: Props) {
return (
<button
type="button"
{...props}
/>
);
}
const rootElement = document.getElementById("root");
render(<Button variant="green" />, rootElement);
Odpoveď č. 2
Mali by ste použiť ButtonHTMLAttributes namiesto HTMLProps, ako je toto:
interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant: 'yellow' | 'green';
}
function Button({ variant, ...props }: Props) {
console.log(variant);
return (
<button
type="button"
{...props}
/>
);
}
