Definitelytyped: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЪрдпрди: Select.onрдЪреЗрдВрдЬ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЧрд▓рдд (?)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЬрдире░ 2019  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/6f8151b70381d83a6b7e2fc1a44086047144eb9e/types/react-select/lib/Select.d.ts#L166

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

onChange?: (value: OptionType | OptionType[], action: ActionMeta) => void;

рдЬрдм рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдЪреНрдЪрд╛ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ ValueType рдХреЛред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВ?

Screen Shot 2020-01-10 at 4 50 20 PM

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ isArray рдЬрд╛рдВрдЪ рдЕрдм рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ OptionType | OptionType[] рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА 12 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрд╛ред

рд╣реИрдВрдбрд▓ рдореЗрдВ value рдЪрдпрдирд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рд░рдгреА рд╣реИ ( isMuli рдкреНрд░реЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп)ред

_onTagChange(
  value: ReactSelectTypes.ValueType<{value: number; label: string}>,
  action: ReactSelectTypes.ActionMeta
) {
  console.log('l68:', value, ' action:', action);
  switch(action.action) {
    case 'pop-value':
    case 'remove-value':
  }
  if (value && value.length > 0) {
   e let firstOption = value[0]; // Errors here with: Element implicitly has an 'any' type because type '{ value: number; label: string; } | { value: number; label: string; }[]' has no index signature.

  }
  // this.setState({ categoryTags: tags });
}

onChange рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХреЗрд╡рд▓ OptionType рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ OptionType рдПрдХ-, рдПрдХрд╛рдзрд┐рдХ- рдпрд╛ рдХреЛрдИ рдорд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдСрдирдЪреЗрдВрдЬ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЧрд╣рди рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП https://github.com/JedWatson/react-select/issues/2902 рджреЗрдЦреЗрдВред

@rvanlaarhoven - рдПрдХрд▓ рдпрд╛ рд╕рд░рдгреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдУрдкреАред рдЖрдИрдПрдордУ рдПрдХ рд╕рд░рдгреА рдХреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЪрд╛рд╣реЗ isMulti рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рдгреА рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╕рд░рдгреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдУрд╣ рд╣рд╛рдВ...

рдореИрдВ @JoshMcCullough рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ
рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Arrays.
рдпрджрд┐ рд╣рдо рд╕рд┐рдВрдЧрд▓ рд╕реЗрд▓реЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдПрд░реЗ рд╕реЗ рд╕рд┐рдВрдЧрд▓ рдЖрдЗрдЯрдо рд▓реЗрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдПрд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдпрд╣ рд╣реИ рдХрд┐ isMulti рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд░рдгреА рдпрд╛ рдПрдХрд▓ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА onChange рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдпреВрдирд┐рдпрдирд┐рдВрдЧ рдпрд╛ рд╕рд╢рд░реНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? (рдЪреЗрддрд╛рд╡рдиреА: рдкрд░реАрдХреНрд╖рдг рди рдХрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░)

interface BaseProps<OptionType extends OptionTypeBase = { label: string; value: string }> extends SelectComponentsProps {
  ... /* all existing fields except isMulti and onChange */
}

interface SingleValueProps<...> extends BaseProps<...> {
  isMulti: false;
  onChange: (value: OptionType | null | undefined, action: ActionMeta) => void;
}

interface MultiValueProps<...> extends BaseProps<...> {
  isMulti: true;
  onChange: (value: OptionsType<OptionType> | null | undefined, action: ActionMeta) => void;
}

/* where the props are defined */
selectProps: SingleValueProps<...> | MultiValueProps<...>

рдпрд╛ рд╢рд╛рдпрдж

interface Props<IsMulti extends boolean, OptionType extends OptionTypeBase = { label: string; value: string }> extends SelectComponentsProps {
  ...
  isMulti: IsMulti,
  onChange: (value: ValueType<IsMulti, OptionType>, action: ActionMeta) => void;
  ...
}

export type ValueType<IsMulti extends boolean, OptionType extends OptionTypeBase> =
  (IsMulti extends false ? OptionType : OptionsType<OptionType>) | null | undefined;

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдЖрдк рд╣рд╛рд░реНрдб-рдХреЛрдб isMulti (рдЙрджрд╛рд╣рд░рдг <Select isMulti={false} /> рд▓реЗрдХрд┐рди рдирд╣реАрдВ рдпрджрд┐ рдЖрдк <Select isMulti={getValue()} /> рдЬреИрд╕реЗ рдмрдпрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд░рдгрдиреАрддрд┐ рд╢рд╛рдпрдж рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВ?

Screen Shot 2020-01-10 at 4 50 20 PM

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ isArray рдЬрд╛рдВрдЪ рдЕрдм рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ OptionType | OptionType[] рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

props.onChange((v as YourOptionTypeHere).value);

рдХреНрдпрд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдмрд╣реБ рдореВрд▓реНрдп undefined, Array<Option>, Option ?

@hoetmaaiers рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

type Nullable<T> = T | null | undefined;

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛:
interface iOption { label: string; value: string; };

рдФрд░ рдлрд┐рд░, рдкреИрд░рд╛рдореАрдЯрд░ рдбрд╛рд▓рд╛:
onChange={(option) => myMethod((option as iOption).value) }

as рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреВрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ?

option: ValueType<{value :string, label: string}>

as рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛? рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрдЧ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ (рд╢рд╛рдпрдж рд╣реЛрдЧрд╛)ред

рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдСрди рдЪреЗрдВрдЬ (рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХрд┐рд╕реА рднреА рдмрд╣реБ рдЪрдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рдкрд░ рдПрдХрд▓ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрд╛рд╕реНрдЯ рдХрд░рдирд╛ рд╡рд╛рдХрдИ рдкрд░реЗрд╢рд╛рди рд╣реИ ....

рд╣рд░ рдмрд╛рд░ рдореБрдЭреЗ рдЖрдЗрдЯрдо => (рдЖрдЗрдЯрдо рдХреЛ OptionTypeBase рдХреЗ рд░реВрдк рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╛рдиред рд╕рдЪ рдореЗрдВ рдЦрд╝рд░рд╛рдмред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ArtemZag picture ArtemZag  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Loghorn picture Loghorn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lilling picture lilling  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

svipas picture svipas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

[рдбреА3] рдореЙрдбреНрдпреВрд▓ 'рдбреА3-рд╕реНрдХреЗрд▓' рдкрд╣рд▓реЗ рд╣реА 'рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯрдХреВрд▓' рдирд╛рдо рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рдЪреБрдХрд╛ рд╣реИред рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
matt-senseye picture matt-senseye  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ