В чем причина ts ошибки при передаче пропсов в компонент?

При попытке передать в компонент Select все остальные props - { ...props } - props Options начинает подсвечиваться ошибкой:

Type 'OptionType[]' is not assignable to type 'readonly (string | number | GroupBase)[]'.
Type 'OptionType' is not assignable to type 'string | number | GroupBase'.
Property 'options' is missing in type 'OptionType' but required in type 'GroupBase'.

если не пытаюсь делать спред пропсов в Select, то все ок, options передается без ошибок. Возможно я неправильно расширяя интерфейс ISelectProp от наивного элемента select? И как при такой записи передать ref в компонент Select?

import React from 'react';
import Select from 'react-select';

export type OptionType = {
    value: string;
    label: string;
};

interface ISelectProps extends React.ComponentPropsWithRef<'select'> {
    caption?: string;
    options?: OptionType[];
    className?: string;
}

export const DefaultSelect = React.forwardRef<HTMLSelectElement, ISelectProps>(
    ({
         options = [], 
         placeholder = 'Выберите марку',
         disabled, 
         ...props
     }, ref
    ) => {

        return (
            <Select
                options={options}
                placeholder={placeholder}
                isDisabled={disabled}
                noOptionsMessage={() => 'Нет совпадений'}
                {...props}
            />
        );
    },
);

DefaultSelect.displayName = 'Select';
  • Вопрос задан
  • 475 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Где-то среди >260 свойств из React.ComponentPropsWithRef<'select'> находится свойство, которое дженерик Option в Select устанавливает как string | number с большим приоритетом, чем то что ты кладёшь собственно в Options. Можешь поискать сам убирая по одному или сравнивая с декларацией для Select.

Но в принципе решение просто выкинуть React.ComponentPropsWithRef<'select'>, т.к. ты расширяешь не нативный select, а react-select.
import Select, { Props } from 'react-select';

interface ISelectProps extends Props<OptionType> {
    caption?: string;
    disabled?: boolean
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы