'(e: ChangeEvent<HTMLInputElement>) => void' 不可分配给类型 '((event: ChangeEvent<HTMLInputElement>) => void)

kus*_*lvm 5 typescript reactjs styled-components

export interface InputProps {
    type?: string;
    name?: string;
    value?: CommonTypeTuple;
    placeholder?: string;
    label?: string;
    error?: string;
    helpText?: string;
    block?: boolean;
    disabled?: boolean;
    onChange?: ChangeHandler<string>;
    onBlur?: BlurHandler<string | number>;
}

export const Input = ({
    type = "text",
    name = "",
    placeholder,
    error,
    block = false,
    disabled = false,
    onChange = () => {},
    onBlur = () => {},
    value,
    className = "",
    ...rest
}: InputProps & React.InputHTMLAttributes<HTMLInputElement>) => {
    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        onChange(e.target.value, e.target.name);
    };
    const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {
        onBlur(e.target.value);
    };
    return (
        <StyledWrapper block={block}>
            <StyledInput
                name={name}
                type={type}
                placeholder={placeholder}
                error={error}
                disabled={disabled}
                onBlur={handleBlur}
                onChange={handleChange}
                value={value}
                className={className}
                aria-label="tm-input"
                {...rest}
            />
        </StyledWrapper>
    );
};

export const StyledInput = styled.input<InputProps>`
...
...

Run Code Online (Sandbox Code Playgroud)

onChangeonBlur报错

(e: ChangeEvent<HTMLInputElement>) => void' is not assignable to type '((event: ChangeEvent<HTMLInputElement>) => void) & ChangeHandler<string>'.
Type '(e: React.ChangeEvent<HTMLInputElement>) => void' is not assignable to type 'ChangeHandler<string>'.
   Types of parameters 'e' and 'value' are incompatible.
     Type 'string' is not assignable to type 'ChangeEvent<HTMLInputElement>'.ts(2322)
index.d.ts(1977, 9): The expected type comes from property 'onChange' which is declared here on type 'IntrinsicAttributes & Pick<Pick<Pick<DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "type" | ... 283 more ... | "key"> & { ...; } & InputProps, "type" | ... 288 more ... | "key"> & Partial<...>
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我清楚地传递了e.target.value哪个字符串,并且报告的错误假定它期望具有不同签名的两个处理程序函数 nativeonChange和 customhandleChange相同。

Wex*_*Wex 3

React.InputHTMLAttributes<HTMLInputElement>定义onChange(event: ChangeEvent<HTMLInputElement>) => void),而您定义onChangeChangeHandler<string>。您在错误消息中看到的类型是这两种类型的交集。

您可能想使用Omit<T, K>删除重叠的道具:

type ReactInput = React.InputHTMLAttributes<HTMLInputElement>;
type InputArgs = InputProps & Omit<ReactInput, keyof InputProps>
Run Code Online (Sandbox Code Playgroud)
export const Input = ({ ...{}, ...rest }: InputArgs) => { ... }
Run Code Online (Sandbox Code Playgroud)