How to fix this error without any
when I try to map a value with onChange
in react-hook-form
?
Errors:
Array:
An argument of type “T[]” cannot be assigned to a parameter of type “OnChangeValue<T, is Multi>”.ts(2345)
Single:
An argument of type “T | undefined” cannot be assigned to a parameter of type “OnChangeValue<T, isMulti> | undefined”.
The type “T” cannot be assigned to the type “OnChangeValue<T, isMulti> | undefined”.ts(2345)
Code:
import { useCallback, useState } from "react";
import Select, { MultiValue, OnChangeValue, SingleValue } from "react-select";
import { VirtualOption } from "./types";
type PValue<T> = T | T[];
interface VirtualSelectAdapterProps<T, isMulti extends boolean = false>
extends Omit<VirtualSelectProps<T, isMulti>, "value" | "onChange"> {
value?: isMulti extends true ? T[] : T;
onChange: (value?: OnChangeValue<T, isMulti>) => void;
}
function isMultiValue<T>(
arg: MultiValue<T> | SingleValue<T>,
): arg is MultiValue<T> {
return Array.isArray(arg);
}
export const VirtualSelectAdapter = <T, isMulti extends boolean = false>(
props: VirtualSelectAdapterProps<T, isMulti>,
) => {
const { isMulti } = props;
const onChange = useCallback(
(value?: OnChangeValue<VirtualOption<T>, isMulti>) => {
if (isMultiValue(value)) {
const values = value.map((item) => item.value);
return props.onChange(values);
} else {
props.onChange(value?.value);
}
},
[props, isMulti],
);
return <VirtualCustomSelect<T, isMulti> {...props} onChange={onChange} />;
};
interface VirtualSelectProps<T, isMulti extends boolean = false> {
options: VirtualOption<T>[];
placeholder?: string;
drawCount?: number;
isMulti: isMulti;
onChange: (value?: OnChangeValue<VirtualOption<T>, isMulti>) => void;
value?: PValue<T>;
}
export const VirtualCustomSelect = <T, isMulti extends boolean>({
options = [],
drawCount = 200,
placeholder,
isMulti,
onChange,
}: VirtualSelectProps<T, isMulti>) => {
const filter = (searchValue: string) => {
const data = [];
for (const iterator of options) {
if (data.length > drawCount) break;
if (currentValueIncludesSearchValue(searchValue, iterator.label))
data.push(iterator);
}
return data;
};
const [filtered, setFiltered] = useState(filter(""));
return (
<Select<VirtualOption<T>, isMulti>
isMulti={isMulti}
placeholder={placeholder}
onChange={(newValue) => onChange(newValue)}
onInputChange={(newValue) => setFiltered(filter(newValue))}
options={filtered}
/>
);
};
const currentValueIncludesSearchValue = (
searchValue: string,
currentValue: string,
) => {
return currentValue.toLowerCase().includes(searchValue.toLowerCase());
};
I tried different generics and condition (e.g if(isMulti)) and errors is very similar
Tipik HD is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.