reactjs - Hvordan skrive React.useState() som kan ha flere typer som verdi med Typescript
Jeg prøver å skrive useState()-hooken som kan ha tall- og strengtype som verdi.
export interface Select {
selectValue: React.Dispatch<React.SetStateAction<number | string>>;
...
}
Og jeg prøver å bruke komponenten ovenfor slik:
const [value, setValue] = React.useState(0);
<Select selectValue = {setValue} />
Men det gir meg denne feilen.
Type 'Dispatch<SetStateAction<number>>' is not assignable to type 'Dispatch<SetStateAction<string | number>>'.
Type 'SetStateAction<string | number>' is not assignable to type 'SetStateAction<number>'.
Type 'string' is not assignable to type 'SetStateAction<number>'.
Hvordan kan jeg løse denne feilen?
Svar #1
Du trenger bare å gi et generisk typeargument til useState<T> slik:
const [value, setValue] = useState<string | number>(0);
Ellers vil det utlede typen fra din opprinnelige verdi 0, som bare er number. Her er et komplett eksempel:
TS-lekeplasslenke
import {
default as React,
Dispatch,
ReactElement,
SetStateAction,
useState,
} from 'react';
interface SelectProps {
selectValue: string | number;
setSelectValue: Dispatch<SetStateAction<string | number>>;
}
declare function Select (props: SelectProps): ReactElement;
function Example (): ReactElement {
const [value, setValue] = useState<string | number>(0);
return <Select selectValue={value} setSelectValue={setValue} />;
}
Svar #2
Bryt det ned slik:
export interface Select {
selectValue: React.Dispatch<React.SetStateAction<number>> | React.Dispatch<React.SetStateAction<string>>;
...
}
Også, hvorfor sender du setValue, mente du å sende selve verdien? (<Select selectValue={value} />)
