onChange ?: (ValueType, ActionMeta) => void, несовместимо с OptionType - PullRequest
1 голос
/ 23 апреля 2019

Я постоянно получаю ошибку из потока, что react-select. Это происходит после обновления до v2.4.2. Это ясно, что я передаю правильные типы для изменения дескриптора, которые ожидают массив с объектами + OptionType принимает любую строку [string]: any. Кто-нибудь может объяснить, почему это происходит, или это потенциальная ошибка в типе реагирования-выбора?

ошибка потока

Error:Error:line (104)Cannot create `Select` element because array type [1] is incompatible with `OptionType` [2] in the first argument of property `onChange`.
    Error:Error:line (104)Cannot create `Select` element because array type [1] is incompatible with null [2] in the first argument of property `onChange`.
    Error:Error:line (104)Cannot create `Select` element because array type [1] is incompatible with undefined [2] in the first argument of property `onChange`.

пример компонента

// @flow
import * as React from 'react';
import Select from 'react-select';

type LabelValueObject = Object & {
    value: string,
    label: string
}

type State = {
    options: LabelValueObject[],
    selectedOptions: LabelValueObject[],
}

export class ServiceDropdown extends React.Component<Props, State> {
    constructor(props: Props) {
        super(props);

        this.state = {
            options: [],
            selectedOptions: null,
        };
    }

    handleChange = (selectedOptions: LabelValueObject[]): void => {
        this.setState({ selectedOptions });
    };

    render() {
        const { selectedOptions } = this.state;
        return (
            <>
                <Select
                    isMulti
                    isSearchable
                    onChange={this.handleChange}    <=== flow error
                    value={selectedOptions}
                    options={this.state.options}
                />
            </>
        );
    }
}

export default ServiceDropdown;

1 Ответ

1 голос
/ 24 апреля 2019

Функция, полученная onChange, набирается следующим образом:

onChange: (ValueType, ActionMeta) => void,

ValueType определяется следующим образом:

type ValueType = OptionType | OptionsType | null | void

, где OptionsType = Array<OptionType>.

( Ссылки )

Таким образом, исходя из этого, вы также должны добавить тип значения null и undefined/void к типу handleChange.

 handleChange = (selectedOptions: LabelValueObject | LabelValueObject[] | null | void) => { ... }
...