Definitelytyped: λ°˜μ‘ 선택: Select.on잘λͺ»λœ μž…λ ₯ λ³€κ²½(?)

에 λ§Œλ“  2019λ…„ 01μ›” 28일  Β·  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

μœ ν˜•μ΄ OptionType | OptionType[] κ°€ μ•„λ‹ˆκ³  typescriptκ°€ 이λ₯Ό μœ μΆ”ν•  수 μ—†κΈ° λ•Œλ¬Έμ— isArray 검사가 더 이상 μΆ©λΆ„ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  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 값이 ν•˜λ‚˜, μ—¬λŸ¬ 개 λ˜λŠ” μ „ν˜€ 없을 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

TypeScript와 κ²°ν•©λœ onChange ν•Έλ“€λŸ¬μ— λŒ€ν•œ 보닀 심측적인 λ…Όμ˜λŠ” https://github.com/JedWatson/react-select/issues/2902 λ₯Ό μ°Έμ‘°

@rvanlaarhoven -- 단일 λ˜λŠ” 배열을 ν—ˆμš©ν•˜λ„λ‘ OPλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. IMO 배열은 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

μœ ν˜•μ΄ OptionType | OptionType[] κ°€ μ•„λ‹ˆκ³  typescriptκ°€ 이λ₯Ό μœ μΆ”ν•  수 μ—†κΈ° λ•Œλ¬Έμ— isArray 검사가 더 이상 μΆ©λΆ„ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν•΄κ²° λ°©λ²•μœΌλ‘œ ν˜•μ‹ μ–΄μ„€μ…˜μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

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

닀쀑 κ°’ undefined, Array<Option>, Option λŒ€ν•΄ μΈν„°νŽ˜μ΄μŠ€(Typescript)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@hoetmaaiers λ„μš°λ―Έλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

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

ν•΄κ²° λ°©λ²•μœΌλ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν–ˆμŠ΅λ‹ˆλ‹€.
interface iOption { label: string; value: string; };

그런 λ‹€μŒ 맀개 λ³€μˆ˜λ₯Ό μΊμŠ€νŒ…ν–ˆμŠ΅λ‹ˆλ‹€.
onChange={(option) => myMethod((option as iOption).value) }

as λ₯Ό μ‚¬μš©ν•˜λ©΄ typescriptλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  λͺ©μ μ΄ λ¬΄νš¨ν™”λ©λ‹ˆλ‹€. λ‚˜λŠ” λˆ„κ΅¬μ—κ²Œμ„œ κ°€μΉ˜λ₯Ό μ–»μ–΄μ•Ό ν•˜λŠ”κ°€?

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

as λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ ? ν˜„μž¬ ν•΄κ²° 방법은 μ†”λ£¨μ…˜μ΄ μ•„λ‹ˆλ©° ν–₯ν›„ 버그가 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€(μ•„λ§ˆλ„).

λ‚˜λŠ” μ—¬μ „νžˆμ΄ 문제λ₯Ό κ²ͺκ³  있으며 λͺ¨λ“  onChangeμ—μ„œ μˆ˜ν–‰ν•˜λŠ” 것은 정말 μ„±κ°€μ‹  μΌμž…λ‹ˆλ‹€ (닀쀑 선택을 μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—) 단일 μ˜΅μ…˜ μœ ν˜•μœΌλ‘œ 캐슀트 ....

맀번 item =>(item as OptionTypeBase).valueλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 정말 λ‚˜λΉ .

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

alisabzevari picture alisabzevari  Β·  3μ½”λ©˜νŠΈ

fasatrix picture fasatrix  Β·  3μ½”λ©˜νŠΈ

Loghorn picture Loghorn  Β·  3μ½”λ©˜νŠΈ

JWT
svipas picture svipas  Β·  3μ½”λ©˜νŠΈ

victor-guoyu picture victor-guoyu  Β·  3μ½”λ©˜νŠΈ