typescript 如何在React-Select中为onChange事件的选定选项添加自定义类型

oprakyz7  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(183)

我使用react-select创建了一个SelectBox组件,并为其添加了onChange事件。我想在onChange事件中的选定选项中添加类型“SelectedItemType”。然而,onChnage事件的类型是(属性)onChange?:((newValue:未知,actionMeta:ActionMeta)=> void)|undefined因此选项类型是unknown,它阻止我添加unknown以外的类型,这使得从选项中提取对象属性变得困难

  1. import { ForwardedRef, forwardRef } from "react";
  2. import Select, { SelectInstance } from "react-select";
  3. export type SelectedItemType = {
  4. value: string;
  5. label: string;
  6. };
  7. export type SelectProps = {
  8. options: SelectedItemType[];
  9. ref?: ForwardedRef<SelectInstance>;
  10. onChange: (selectedItem: unknown) => void;
  11. };
  12. const SelectBox: React.FC<SelectProps> = forwardRef<
  13. SelectInstance,
  14. SelectProps
  15. >(({ options, onChange, ...props }, ref) => {
  16. return (
  17. <Select
  18. options={options}
  19. ref={ref}
  20. {...props}
  21. onChange={(newValue: unknown) => onChange(newValue)}
  22. />
  23. );
  24. });
  25. export default SelectBox;

在上面的代码中,我想将SelectedItemType添加到onChange的newValue中。但是它抛出了一个错误,说Type '(newValue:SelectedItemType)=> void'不可赋值给类型'(newValue:未知,actionMeta:ActionMeta)=> void '。参数“newValue”和“newValue”的类型不兼容。类型“unknown”不能分配给类型“SelectedItemType”。当我想从选项中提取值和标签时,如何将此自定义类型添加到选项中。

bvn4nwqk

bvn4nwqk1#

如果你想将类型赋值给newValue,以便在onChange函数中很容易地访问它的属性,那么可以通过做两个主要的修改来完成。
1.将SelectPropsonChange属性类型更改为

  1. export type SelectProps = {
  2. options: SelectedItemType[];
  3. ref?: ForwardedRef<SelectInstance>;
  4. onChange: (selectedItem: SelectedItemType) => void;
  5. };

1.则在select组件中,其onChange将被修改为

  1. <Select
  2. options={options}
  3. ref={ref}
  4. {...props}
  5. onChange={(newValue: unknown) => onChange(newValue as SelectedItemType)}
  6. />

然后使用SelectBox组件,如下所示:

  1. <SelectBox
  2. options={[
  3. { label: "A", value: "1" },
  4. { label: "B", value: "2" }
  5. ]}
  6. onChange={function (selectedItem: SelectedItemType): void {
  7. console.log(selectedItem.value);
  8. }}
  9. />

下面是文件App.tsx的完整代码

  1. import { ForwardedRef, forwardRef } from "react";
  2. import Select, { SelectInstance } from "react-select";
  3. export type SelectedItemType = {
  4. value: string;
  5. label: string;
  6. };
  7. export type SelectProps = {
  8. options: SelectedItemType[];
  9. ref?: ForwardedRef<SelectInstance>;
  10. onChange: (selectedItem: SelectedItemType) => void;
  11. };
  12. const SelectBox: React.FC<SelectProps> = forwardRef<
  13. SelectInstance,
  14. SelectProps
  15. >(({ options, onChange, ...props }, ref) => {
  16. return (
  17. <Select
  18. options={options}
  19. ref={ref}
  20. {...props}
  21. onChange={(newValue: unknown) => onChange(newValue as SelectedItemType)}
  22. />
  23. );
  24. });
  25. export default function App() {
  26. return (
  27. <div className="App">
  28. <SelectBox
  29. options={[
  30. { label: "A", value: "1" },
  31. { label: "B", value: "2" }
  32. ]}
  33. onChange={function (selectedItem: SelectedItemType): void {
  34. console.log(selectedItem.value);
  35. }}
  36. />
  37. </div>
  38. );
  39. }
展开查看全部

相关问题