javascript - 具有多个通用参数的通用反应功能组件
问题描述
我正在尝试使用 react-select 和 typescript 创建一个可重用的选择组件。我使用泛型使组件类型更加先进和灵活。
import React from 'react';
import Select, { OptionsType, ValueType } from 'react-select';
export interface IOption<T> {
label: string;
value: T;
}
interface IProps<T, M> {
options: OptionsType<IOption<T>>;
// value: IOption<T>[keyof IOption<T>];
value: IOption<T>;
defaultValue?: IOption<T>;
isMulti?: boolean;
isDisabled?: boolean;
onChange: (value: M extends true ? Array<IOption<T>> : IOption<T>) => void;
}
const ValidatableSelectFieldImp = <T, M extends boolean>({
options,
value,
isMulti = false,
onChange,
...props
}: IProps<T, M>, ref) => {
const handleChange = (
selectedOption: ValueType<IOption<T>, typeof isMulti> | null,
) => {
if (isMulti && selectedOption && Array.isArray(selectedOption)) {
const clonedOptions = [...selectedOption];
return onChange(clonedOptions);
}
onChange((selectedOption));
};
return (
<div>
<Select
ref={ref}
{...props}
isMulti={isMulti}
value={value}
options={options}
onChange={handleChange}
/>
</div>
);
};
export const ValidatableSelectField = React.memo(
React.forwardRef(ValidatableSelectFieldImp),
) as typeof ValidatableSelectFieldImp;
根据是否将 isMulti传递给Select组件,我们会得到不同形状的onChange参数。
我从内部 onChange 收到此错误。(内部 if 语句)
'any[]' 类型的参数不能分配给 'M extends true 类型的参数?IOption[]:IOption'。
而这个来自外部的 onChange
'IOption | 类型的参数 选项类型<IOption> | null' 不能分配给 'M extends true 类型的参数?IOption[]:IOption'。“null”类型不能分配给“M extends true”类型?IOption[]:IOption'。
我想告诉打字稿推断关于isMulti的 onChange 的正确参数类型,所以如果我将isMulti作为 true 传递,那么它将选项参数的类型设置为 Array<IOption>。由于错误,我无法完成我的组件。任何帮助表示赞赏。
解决方案
推荐阅读
- apache-spark - ClickHouse 作为 Apache Spark 的存储引擎
- class - 数据类与没有主体的类有何不同?
- python - Numpy函数获取对应于给定值的分位数
- batch-file - 如何在 cmd 循环中使用通配符“*”回显项目?
- c++ - 如何构造带有常规函数参数的 C++ 可变参数函数
- flutter - 'FormatException: Unexpected character (at character 3)' cerror mapping api response to my state class。任何人都可以解决这个问题吗?
- php - 变量在 dd 上显示,但在 json 资源 laravel 上没有呈现
- if-statement - 对 MIPS 中的 if 跳转感到困惑
- java - 附加
如果数据在 DB 中不可用,则使用 Spring Boot 在 API 响应中动态配对 - reactjs - prevProps 和 props 是一样的