Language-tools: ν† λ‘ : ꡬ성 μš”μ†Œμ—μ„œ μ§€μ›ν•˜λŠ” 이벀트λ₯Ό μž…λ ₯ν•˜λŠ” 방법

에 λ§Œλ“  2020λ…„ 08μ›” 05일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: sveltejs/language-tools

λͺ©ν‘œλŠ” μ˜€νƒ€λ₯Ό μ‰½κ²Œ μž‘μ•„λ‚΄κ³  ꡬ성 μš”μ†Œμ—μ„œ μ „λ‹¬ν•˜λŠ” λͺ¨λ“  κ°€λŠ₯ν•œ 이벀트λ₯Ό μ°ΎλŠ” 데 도움이 λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ²°κ΅­, μž…λ ₯(μ†Œν’ˆ)은 κ°•λ ₯ν•œ 계약을 κ°€μ§ˆ 수 μžˆμ§€λ§Œ 좜λ ₯(이벀트)은 그렇지 μ•Šμ„ μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€. 사싀, props의 κ²½μš°λ³΄λ‹€ 훨씬 더 μ€‘μš”ν•©λ‹ˆλ‹€. λ””μŠ€νŒ¨μΉ˜λŠ” 파일의 μ–΄λŠ κ³³μ—μ„œλ‚˜ λ°œμƒν•  수 μžˆμ§€λ§Œ propsλŠ” 일반적으둜 맨 μœ„μ— κΉ”λ”ν•˜κ²Œ 묢인 μƒνƒœμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ§€κΈˆμ€ on:qoidfoqidjoiqsjd λ₯Ό 잘 μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ»΄νŒŒμΌλŸ¬κ°€ 이λ₯Ό μœ„ν•΄ μ‚¬μš©μž 지정 주석을 μ‚¬μš©ν•˜λŠ” Flex: https://github.com/apache/flex-sdk/blob/master/frameworks/projects/mx/src/mx/core/Container.as#L97

μ•„λ§ˆλ„ μš°λ¦¬λŠ” export type Events = {name: 'eventA', data: number} | ... 와 같은 νŠΉλ³„ν•˜κ³  μ˜ˆμ•½λœ κ·œμΉ™μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
TSDoc이 μ†ŒλΉ„μž μΈ‘ 툴팁으둜 μ΄μ–΄μ§€κ²Œ ν•˜λŠ” 것은 케이크에 μž₯식이 될 κ²ƒμž…λ‹ˆλ‹€.

enhancement

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이제 Svelte 3.25.0에 λ„μž…λœ createEventDispatcher 타이핑을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ©΄

const dispatch = createEventDispatcher<{foo: string; bar: boolean}>();

ꡬ성 μš”μ†Œ λ‚΄μ—μ„œ dispatch λŒ€ν•œ κ°•λ ₯ν•œ μž…λ ₯을 μ–»κ³  foo / bar 이벀트λ₯Ό μˆ˜μ‹ ν•˜λ©΄ κ°•λ ₯ν•œ μž…λ ₯을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

on:foo={e => ... // <- e is of type CustomEvent<string>

λ˜ν•œ 이제 μ΄λ²€νŠΈμ— λŒ€ν•œ 훨씬 더 λ‚˜μ€ μžλ™ μ™„μ„± κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬μ „νžˆ λ‹€λ₯Έ 이벀트λ₯Ό μˆ˜μ‹ ν•  수 μžˆμœΌλ―€λ‘œ " createEventDispatcher 톡해 μ •μ˜λœ 이벀트만 μˆ˜μ‹  λŒ€κΈ°"λΌλŠ” 의미의 μœ ν˜• μ•ˆμ „μ€ μ—¬μ „νžˆ ComponentEvents μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” 이벀트λ₯Ό μ—„κ²©ν•˜κ²Œ λ§Œλ“œλŠ” 무언가(μ•„λ§ˆλ„ 슀크립트 νƒœκ·Έ 속성)λ₯Ό μ œκ³΅ν•  κ³„νšμž…λ‹ˆλ‹€.

κ΄€λ ¨ λ¬Έμ„œ: https://github.com/sveltejs/language-tools/blob/master/docs/preprocessors/typescript.md#typing -component-events

λͺ¨λ“  5 λŒ“κΈ€

이것이 μ‰½κ²Œ κ΅¬ν˜„λ˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” κ°€λŠ₯ν•œ λͺ¨λ“  이벀트λ₯Ό μˆ˜μ§‘ν•˜λŠ” 것이 propsλ₯Ό μˆ˜μ§‘ν•˜λŠ” 것보닀 훨씬 μ–΄λ ΅κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이것이 μ†Œν’ˆμš©μ΄κΈ° λ•Œλ¬Έμ— μžλ™ 완성이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” μ΄μœ μ΄κΈ°λ„ ν•©λ‹ˆλ‹€.

λ‚΄λΆ€λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ propsκ°€ jsx propsλ₯Ό 톡해 κ΅¬ν˜„λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ²€νŠΈλŠ” μˆ˜μ§‘ μ œν•œ λ•Œλ¬Έμ΄ μ•„λ‹™λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λͺ…μ‹œμ μœΌλ‘œ μž…λ ₯ν•˜λ©΄ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€. μ–ΈκΈ‰λœ 문제 λ•Œλ¬Έμ— λ°œμ†‘λœ 이벀트λ₯Ό "μ •μ˜μ™€ μΌμΉ˜ν•˜μ§€ μ•ŠμŒ"으둜 ν‘œμ‹œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ˜ˆμ•½λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°–λŠ” 것이 μ•žμœΌλ‘œ λ‚˜μ•„κ°ˆ κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 이전에 일반 props의 λ§₯λ½μ—μ„œ 이에 λŒ€ν•΄ μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ•½λœ μΈν„°νŽ˜μ΄μŠ€ 이름은 ComponentEvents , ComponentProps , ComponentSlots 및 ComponentDef μžˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨ #304

on:<event> λ₯Ό μ‚¬μš©ν•˜μ—¬ μžλ™ 완성을 μ–»λŠ” 것은 λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ ν›„λ“œ μ•„λž˜μ—μ„œ μ΄λŸ¬ν•œ μžλ™ 완성을 μ–»κΈ° μœ„ν•΄ JSXλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. "μ¦‰μ‹œ" μžλ™ μ™„μ„± κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄ on:<event> κ°€ μ†Œν’ˆμ˜ μΌλΆ€λ‘œ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것은 JSXκ°€ props에 : 와 같은 문자λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
또 λ‹€λ₯Έ λ¬Έμ œλŠ” ν˜„μž¬ TypeScript둜 μˆ˜ν–‰ν•  수 μ—†λŠ” on: μ•žμ— 이벀트 μœ ν˜• μ •μ˜λ₯Ό λ³€ν™˜ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€( κ΄€λ ¨ TS 문제 ).

μ΄λŸ¬ν•œ μ œμ•½ μ‘°κ±΄μ—μ„œ 두 가지 μ†”λ£¨μ…˜μ΄ λ°œμƒν•©λ‹ˆλ‹€.

  • κ°œλ°œμžμ—κ²Œ __on__<eventName>: .. 와 같은 이벀트λ₯Ό μž…λ ₯ν•˜λΌκ³  λ§ν•˜λ©΄ μ–Έμ–΄ μ„œλ²„μ—μ„œ μžλ™ μ™„μ„± 쀑에 __on__ λ₯Ό on: 둜 λ°”κΏ‰λ‹ˆλ‹€. 이것은 차선책이고 λΆ€μ„œμ§€κΈ° μ‰¬μš΄ λŠλ‚Œμž…λ‹ˆλ‹€.
  • 이λ₯Ό μœ„ν•΄ "자체" μžλ™ 완성을 κ΅¬ν˜„ν•©λ‹ˆλ‹€. 이것은 μ•„λ§ˆλ„ μ–΄λ €μš΄ μž‘μ—…μ΄μ§€λ§Œ κΉ¨λ—ν•œ μ†”λ£¨μ…˜μœΌλ‘œ μ΄μ–΄μ§ˆ κ²ƒμž…λ‹ˆλ‹€.

μ‚¬μš©μžκ°€ 이벀트λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μž…λ ₯ν•˜λŠ” 경우 $on λ©”μ„œλ“œ μ •μ˜κ°€ CustomEvent<any> λ˜λŒμ•„κ°€μ§€ μ•ŠλŠ” λ³€ν˜•μ„ 톡해 #386이 λ³‘ν•©λœ ν›„ " on:XXX κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€" 였λ₯˜κ°€ μ‰½κ²Œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. .

https://github.com/sveltejs/svelte/pull/5260 이 릴리슀되면 svelte2tsx λ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ createEventDispatcher κ²€μƒ‰ν•˜κ³  μœ ν˜• 주석이 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  κ·Έλ ‡λ‹€λ©΄ μ μ ˆν•œ μœ ν˜•μ„ κ°€μ Έμ˜€λŠ” 데 μ‚¬μš©ν•©λ‹ˆλ‹€.

이제 Svelte 3.25.0에 λ„μž…λœ createEventDispatcher 타이핑을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ©΄

const dispatch = createEventDispatcher<{foo: string; bar: boolean}>();

ꡬ성 μš”μ†Œ λ‚΄μ—μ„œ dispatch λŒ€ν•œ κ°•λ ₯ν•œ μž…λ ₯을 μ–»κ³  foo / bar 이벀트λ₯Ό μˆ˜μ‹ ν•˜λ©΄ κ°•λ ₯ν•œ μž…λ ₯을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

on:foo={e => ... // <- e is of type CustomEvent<string>

λ˜ν•œ 이제 μ΄λ²€νŠΈμ— λŒ€ν•œ 훨씬 더 λ‚˜μ€ μžλ™ μ™„μ„± κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬μ „νžˆ λ‹€λ₯Έ 이벀트λ₯Ό μˆ˜μ‹ ν•  수 μžˆμœΌλ―€λ‘œ " createEventDispatcher 톡해 μ •μ˜λœ 이벀트만 μˆ˜μ‹  λŒ€κΈ°"λΌλŠ” 의미의 μœ ν˜• μ•ˆμ „μ€ μ—¬μ „νžˆ ComponentEvents μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” 이벀트λ₯Ό μ—„κ²©ν•˜κ²Œ λ§Œλ“œλŠ” 무언가(μ•„λ§ˆλ„ 슀크립트 νƒœκ·Έ 속성)λ₯Ό μ œκ³΅ν•  κ³„νšμž…λ‹ˆλ‹€.

κ΄€λ ¨ λ¬Έμ„œ: https://github.com/sveltejs/language-tools/blob/master/docs/preprocessors/typescript.md#typing -component-events

@dummdidumm

createEventDispatcher λŒ€ν•œ 일뢀 μˆ˜μ‹  μ΄λ²€νŠΈκ°€ μœ ν˜•μ„ μˆ˜μ‹ ν•˜μ§€ μ•ŠλŠ” μ΄μœ μ— λŒ€ν•œ 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ?

μ˜ˆμ‹œ:

// Component Foo
const dispatchFoo = createEventDispatcher<{foo: string; bar: boolean}>();
const dispatchBar = createEventDispatcher<{bar: string; baz: string}>();

// Component Bar
// e is CustomEvent<any>
on:foo="{(e) => handleFoo(e.detail.bar)}"
// e is CustomEvent<{baz: string}>
on:bar="{(e) => handleBar(e.detail.bar)}"

typescript μ»΄νŒŒμΌλŸ¬λŠ” μ˜ˆμƒλŒ€λ‘œ 이것을 ν¬μ°©ν•©λ‹ˆλ‹€.

μˆœμ„œλ₯Ό λ³€κ²½ν•˜λ©΄ λ‹€λ₯Έ κ²°κ³Όκ°€ μƒμ„±λ©λ‹ˆλ‹€.

createEventDispatcher μˆœμ„œκ°€ λ³€κ²½λ˜λ©΄ typescript μ»΄νŒŒμΌλŸ¬λŠ” 였λ₯˜λ₯Ό ν¬μ°©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λ§ˆμ§€λ§‰ createEventDispatcher 만이 λ¦¬μŠ€λ„ˆμ˜ μœ ν˜•μ„ μƒμ„±ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

// Component Foo
const dispatchBar = createEventDispatcher<{bar: string; baz: string}>();
const dispatchFoo = createEventDispatcher<{foo: string; bar: boolean}>();

// Component Bar
// e is CustomEvent<{bar: boolean}>
on:foo="{(e) => handleFoo(e.detail.bar)}"
// e is CustomEvent<any>
on:bar="{(e) => handleBar(e.detail.bar)}"

typescript μ»΄νŒŒμΌλŸ¬λŠ” 이제 μœ ν˜•μ΄ CustomEvent<any> μ΄λ―€λ‘œ 였λ₯˜λ₯Ό ν¬μ°©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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