reactjs - react-select och typescript: Typ 'string' kan inte tilldelas typen 'ValueType<OptionTypeBase>'
Jag försöker skapa en exempelkomponent som använder react-select med TypeScript.
För detta skapade jag en funktionell komponent och lade till standardexemplet från react-select-dokumentationen:
const options = [
{value: 'chocolate', label: 'Chocolate'},
{value: 'strawberry', label: 'Strawberry'},
{value: 'vanilla', label: 'Vanilla'},
];
const MyComponent = () => {
const [selectedOption, setSelectedOption] = useState('chocolate');
const handleChange = (option: string) => {
setSelectedOption(option);
};
return (
<Select
value={selectedOption}
onChange={(option) => handleChange(option)}
options={options}
/>
);
};
Men detta ger mig ett fel:
Overload 1 of 2, '(props: Readonly<Pick<Props<OptionTypeBase>, string | number> & Props<OptionTypeBase> & Props<OptionTypeBase>>): StateManager<...>', gave the following error.
Type 'string' is not assignable to type 'ValueType<OptionTypeBase>'.
Overload 2 of 2, '(props: Pick<Props<OptionTypeBase>, string | number> & Props<OptionTypeBase> & Props<OptionTypeBase>, context?: any): StateManager<...>', gave the following error.
Type 'string' is not assignable to type 'ValueType<OptionTypeBase>'.
Vad gör jag för fel?
Mina paket är:
"@types/react": "^16.9.19",
"@types/react-dom": "^16.9.5",
"@types/react-select": "^3.0.10",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react-select": "^3.0.8",
"typescript": "^3.7.5"
Svar #1
Du behöver ställa in ett värde från din alternativ-array som det aktuella värdet på Select-komponenten.
Detta är dock inte det enda problemet eftersom typ-signaturen för onChange-funktionen är något förvirrande. Du kommer behöva definiera en typ för alternativen och använda `ValueType` i onChange-funktionssignaturen.
Här är ett fungerande exempel
type OptionType = {
value: string;
label: string;
};
const options: OptionType[] = [
{ value: "chocolate", label: "Chocolate" },
{ value: "strawberry", label: "Strawberry" },
{ value: "vanilla", label: "Vanilla" }
];
const MyComponent = () => {
const [selectedOption, setSelectedOption] = useState<ValueType<OptionType>>(options[0]);
const handleChange = (option: ValueType<OptionType>) => {
setSelectedOption(option);
};
return (
<Select
value={selectedOption}
onChange={option => handleChange(option)}
options={options}
/>
);
};
Mer information om problemet https://github.com/JedWatson/react-select/issues/2902
Sandbox med koden ovan https://codesandbox.io/s/angry-frost-5bh1o
