Definitelytyped: response-select: Select.onChange Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½Π΅Π²Π΅Ρ€Π½ΠΎ (?)

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 28 янв. 2019  Β·  12ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: DefinitelyTyped/DefinitelyTyped

https://github.com/DefinitiTyped/DefinitiTyped/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 prop).

_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 для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ обсуТдСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° onChange Π² сочСтании с TypeScript.

@rvanlaarhoven - ОбновлСн OP, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ массив. IMO массив Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹Π±Ρ€Π°Π½ Π»ΠΈ select isMulti . ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ просто ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ массив ΠΈ Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, являСтся Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ массивом. Но Π΄Π° Π»Π°Π΄Π½ΠΎ ...

Я согласСн с @JoshMcCullough
Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΡ‰Π΅, Ссли Π±Ρ‹ Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС с массивами.
Если ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€, ΠΌΡ‹ просто Π±Π΅Ρ€Π΅ΠΌ СдинствСнный элСмСнт ΠΈΠ· массива, ΠΈΠ½Π°Ρ‡Π΅ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с массивом - Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π΅ трСбуСтся. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя я понимаю, Ρ‡Ρ‚ΠΎ это нСпростоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ‚Π°ΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.

Π‘ΠΎΠ»ΡŒΡˆΠ΅ всСго мСня Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ возвращаСтся массив ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ значСния 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);

ДоступСн Π»ΠΈ интСрфСйс (Typescript) для ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-значСния 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 ? Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π½Π΅ являСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ (вСроятно, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚) ΠΊ ошибкам Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Π£ мСня всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ onChange (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ мноТСствСнный Π²Ρ‹Π±ΠΎΡ€) ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ СдинствСнному Ρ‚ΠΈΠΏΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ....

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ item => (item as OptionTypeBase) .value. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ