Language-tools: Svelte ๊ตฌ์„ฑ ์š”์†Œ ์†Œํ’ˆ/์ด๋ฒคํŠธ/์Šฌ๋กฏ ์ž…๋ ฅ

์— ๋งŒ๋“  2020๋…„ 08์›” 11์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sveltejs/language-tools

์ด์— ๋Œ€ํ•ด ์ด๋ฏธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ(#424, #304, #273, #263)๊ฐ€ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ†ตํ•ฉ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ด€๋ จ ํ™๋ณด: #437

์ด ๋ฌธ์ œ๋Š” d.ts ํŒŒ์ผ์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‚˜์ค‘์— ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ์š”์ฒญ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?
ํ˜„์žฌ ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ž…๋ ฅ/์ถœ๋ ฅ์„ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ์†Œํ’ˆ๊ณผ ์ด๋ฒคํŠธ/์Šฌ๋กฏ(์ œ๋„ค๋ฆญ) ๊ฐ„์˜ ์ผ๋ฐ˜์ ์ธ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ๋ฐ ํ•ด๋‹น ์œ ํ˜•์„ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์Šฌ๋กฏ๊ณผ ์Šฌ๋กฏ ์œ ํ˜•์„ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ์†”๋ฃจ์…˜ ์„ค๋ช…
props/events/slots๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ: ์ƒˆ๋กœ์šด ์˜ˆ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค ComponentDef ์ •์˜ ์‹œ ์ฝ”๋“œ์—์„œ ์ถ”๋ก ํ•˜๋Š” ๋Œ€์‹  ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ณต๊ฐœ API๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ(๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช… ํฌํ•จ):

<script lang="ts"
   interface ComponentDef<T> { // <-- note that we can use generics as long as they are "defined" through props
      props: {  items: T[]  }
      events: {  itemClick: CustomEvent<T>  }
      slots: { default: { item: T } }
  }

   // generic type T is not usable here. Is that a good solution? Should it be possible?
   // Also: How do we make sure the types match the component definition?
  export items: any[];

   // ...

   // We cannot make sure that the dispatched event and its type are correct. Is that a problem?
   // Maybe enhance the type definitions in the core repo so createEventDispatcher accepts a record of eventname->type?
   dispatch('itemClick', item);
</script>
<!-- ... -->
<slot item={item}> <!-- again, we cannot make sure this actually matches the type definition -->

์ด์ œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†Œํ’ˆ/์ด๋ฒคํŠธ/์Šฌ๋กฏ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ์ง„๋‹จ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

<Child
     items="{['a', 'string']}"
     on:itemClick="{event => event.detail === 1 /* ERROR, number not comparable to type string */}"
/>

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๊ณ  ์•ฝ๊ฐ„ ํ…Œ์ŠคํŠธ๋˜๋ฉด ComponentEvents ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ˆ์•ฝ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜๋งŒ ์ž…๋ ฅํ•˜๋„๋ก ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ํฐ ๋ณ€ํ™”์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ต์‹ฌ ํŒ€ ๊ตฌ์„ฑ์› ์ค‘ ์ผ๋ถ€๊ฐ€ ์ด๊ฒƒ์ด ์ž์‹ ์—๊ฒŒ ์ข‹์•„ ๋ณด์ด๊ฑฐ๋‚˜ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๋‚ด์šฉ์„ ์†Œ๊ฐœํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@jasonlyu123 @orta @Conduitry @antony @pngwn

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•„๋งˆ๋„ ์—ฌ๊ธฐ์„œ ์ž˜๋ชป๋œ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์˜ ์˜ˆ:

```html


{option.myLabelProp}

{#๊ฐ ์˜ต์…˜์„ ์˜ต์…˜์œผ๋กœ} {/๊ฐ}

๋ชจ๋“  24 ๋Œ“๊ธ€

ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๋Ÿฐํƒ€์ž„์— ์Šฌ๋กฏ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ Svelte ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/sveltejs/svelte/issues/2588 ๋ฐ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” PR https://github.com/sveltejs/svelte/pull/4296 , ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ์ ์–ด๋„ ์ผ๋ถ€ ๊ธฐํšŒ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค(ํ•ฉ์˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ„์˜ PR์— ์—ฌ์ „ํžˆ ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค).

PR ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์—์„œ ์šฐ๋ฆฌ์™€ ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ…œํ”Œ๋ฆฟ ์ˆ˜์ค€์—์„œ ์œ ํ˜• ๊ฒ€์‚ฌ์˜ ๋“ค์—ฌ ์“ฐ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด.
๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

<script lang="ts" generic="T"> 
    type T = unknown
    export let items: T[]
    let item:T = items[0]
</script>
<slot b={item}></slot>

typecheck ๋™์•ˆ type T = unknown ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  ๊ตฌ์„ฑ ์š”์†Œ์— ์ผ๋ฐ˜ ์ธ์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

//...
render<T>() {
    export let items: T[]
    let item:T = items[0]
}

render ํ•จ์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค

<script lang="ts">
    interface ComponentDef<T> {
       ...
    } 
    type T = unknown
    export let items: T[]
    let item:T = items[0]
</script>
<slot b={item}></slot>

์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—์„œ T ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด "๋‚ด ์†Œํ’ˆ๊ณผ ์Šฌ๋กฏ ์‚ฌ์ด์˜ ์ผ๋ฐ˜์ ์ธ ๊ด€๊ณ„๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค"์˜ ๊ฒฝ์šฐ ๋” ์ ๊ฒŒ ์ž…๋ ฅํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด๋Š” ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ๋Š” "์˜ˆ, ๋‘˜ ๋‹ค ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” API ํ‘œ๋ฉด์„ ๋„ˆ๋ฌด ๋งŽ์ด ํ™•์žฅํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค(๊ฐ™์€ ์ž‘์—…์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) - ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

interface ComponentDef<T>{ props: {} } ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋‚ด ์ˆ˜์ถœํ’ˆ์˜ ๊ฐ ํ•ญ๋ชฉ๊ณผ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Svelte๋Š” React์™€ ๋น„๊ตํ•˜์—ฌ ์ž…๋ ฅ๋œ ๋ฌธ์ž๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋งค์šฐ ๋›ฐ์–ด๋‚˜๋ฉฐ ์ด๋Š” ํ•œ ๊ฑธ์Œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ชจ๋“  ๋‚ด๋ณด๋‚ด๊ธฐ ์œ ํ˜•์„ props๋กœ ๋ณต์ œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ž์ฃผ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Œ).

๋‚˜๋Š” @halfnelson ์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์†Œํ’ˆ์œผ๋กœ ๊ฐ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์ด ํ•œ ๋ฒˆ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ๋ฌธ์ œ์—์„œ ์ฝ์€ ๋˜ ๋‹ค๋ฅธ ๋น ๋ฅธ ๋ฌธ์ œ: @template ์˜ต์…˜์„ ํฌํ•จํ•˜์—ฌ JSDoc ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ์„ ์ž…๋ ฅํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

JSDoc(HTML ๋‚ด์—์„œ JSDoc์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„)์— ๋Œ€ํ•ด ์—ด๋ฆฐ ๋งˆ์Œ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜์ง€๋งŒ WebStorm์„ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋“  VS Code๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋“  ๋‹จ์ˆœํžˆ TypeScript๋กœ ํ‘œํ˜„๋ ฅ์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ์ ์„ ๊ฒฝ๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด true ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์œ ํ˜•์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ Record<keyof X, any> ๋„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ๊ณ„์† ๋ฒฝ์— ๋ถ€๋”ช์นœ๋‹ค. @template ๋„ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๊ฝค ์ œํ•œ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  IDE์— ๋”ฐ๋ผ์„œ๋„ ๋‹ค๋ฅด๊ฒŒ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ์œ ํ˜•์— (jsx) ์š”์†Œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์œ ํšจํ•œ svelte ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์€ ์†์„ฑ์— ์˜ํ•ด ๊ตฌ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋กฏ/์ด๋ฒคํŠธ์—๋งŒ ์ œ๋„ค๋ฆญ ์ข…์†์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. jsx ์š”์†Œ์— ์ œ๋„ค๋ฆญ์„ ์ „๋‹ฌํ•˜๋Š” ์ž…๋ ฅ ์†์„ฑ์— ์˜ํ•ด ๊ตฌ๋™๋˜๋Š” ๊ฒฝ์šฐ TS๊ฐ€ ์ด๋ฅผ ์œ ์ถ”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ svelte2tsx ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒ€์ดํ•‘ ์˜ค๋ฒ„ํ—ค๋“œ์— ๊ด€ํ•˜์—ฌ: ์ด๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€๋งŒ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ์ด๋ฒคํŠธ/์Šฌ๋กฏ์„ ์ž…๋ ฅํ•˜๋ ค๋Š” ์ƒํ™ฉ์—์„œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ƒ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ์Šค์Šค๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์˜ ์˜ˆ๋Š” #263๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ์Šฌ๋กฏ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์ง€์›๊ณผ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ createEventDispatcher ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. createEventDispatcher ํ•ญ๋ชฉ์„ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค).

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ์ƒํ™ฉ์ด ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ Svelte์˜ "์œ ํ˜•์„ ๋œ" ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ œ๊ณตํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ComponentDef ๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ œํ’ˆ์ž…๋‹ˆ๋‹ค.
  • ComponentEvents ๋Š” ์ด๋ฒคํŠธ ์ž…๋ ฅ ์ „์šฉ์ž…๋‹ˆ๋‹ค.
  • ComponentSlots ๋Š” ์ž…๋ ฅ ์Šฌ๋กฏ ์ „์šฉ์ž…๋‹ˆ๋‹ค.
  • ์ œ๋„ค๋ฆญ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ <script generic="T"> ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ
  • ComponentEvents/ComponentSlots/generic="T" ์˜ ์กฐํ•ฉ

@shirakaba JSDoc ์œ ํ˜• ์ง€์›์ด typescript๋งŒํผ ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์œผ๋กœ ์ œ๋„ค๋ฆญ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž…๋ ฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ typescript์˜ ์–ธ์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ณ ๊ธ‰ ์œ ํ˜•์„ typescript ํŒŒ์ผ์—์„œ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šฌ๋กฏ ์†Œํ’ˆ ์œ ํ˜• ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ํ•ดํ‚น์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ข‹์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์œผ๋กœ ์ด์–ด์งˆ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์œ ํ˜• ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ:

interface ComponentDef {
      slots: { default: { item: string } }
  }

์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

class DefaultSlot extends Svelte2TsxComponent<ComponentDef['slots']['default']>{ }

๊ธฐ๋ณธ ์Šฌ๋กฏ์„ ๋‹ค์Œ์œผ๋กœ ๋ณ€ํ™˜

<DeafaultSlot />

(์‚ฌ์šฉ์ž๋กœ์„œ๋งŒ ์ฐธ์—ฌ) TypeScript๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์–ด์จŒ๋“  ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ์ž…๋ ฅ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

interface vs. generic prop์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜๊ฐ€ ์†Œ๋น„์ž์—๊ฒŒ๋งŒ ๋…ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ prop์„ ์ง€์›ํ•˜๋Š” DX๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฉ”๋ชจ์—์„œ generic="T" export type T ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž˜๋ชป๋œ TS ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Svelte ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ธ ๊ฒฝ์šฐ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€ ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ธ์–ด ๋„๊ตฌ๋Š” ์Šคํฌ๋ฆฝํŠธ์— ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ด ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ดํ•ด ํ–ˆ์–ด์š”. ์˜ค๋ž˜ ๋จธ๋ฌผ์ง€ ์•Š์ง€๋งŒ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์ด๊ฑฐ๋‚˜ "์ •์˜๋˜์ง€ ์•Š์€/์•Œ ์ˆ˜ ์—†๋Š” ์œ ํ˜•" ์˜ค๋ฅ˜์ž…๋‹ˆ๊นŒ? TypeScript์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๋ชฐ๋ผ์„œ ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” script ํƒœ๊ทธ์— ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์˜ˆ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ "generic"๊ณผ ๊ฐ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. :)

๋Œ€์ฒด๋กœ ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ์ข‹์€ ๊ธฐ๋Šฅ์ด๋ฉฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ด๋ณด๋‚ธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ•์ œ๋กœ ์ž…๋ ฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(๋” ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ).

export type T; ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด TS์—์„œ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ณต์‹ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? export type T extends string; ๋Š” ๋” ๋งŽ์€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์†์„ฑ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜ˆ์•ฝ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋ฐฉํ•ด๊ฐ€ ์ ์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ T1 ๋˜๋Š” T2 ์™€ ๊ฐ™์€ ์˜ˆ์•ฝ๋œ ์œ ํ˜• ์ด๋ฆ„์„ ๊ฐ–๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ์œ ์—ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•?).

๋Œ€์•ˆ์€ ComponentDef ๋ฅผ ํ†ตํ•ด ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‹œ์ž‘ ๊ฒŒ์‹œ๋ฌผ์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ์„ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ํƒ€์ดํ•‘์„ ์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋” ๋งŽ์€ ์˜ต์…˜์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ํ† ๋ก ์—์„œ ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค( ComponentDef , ์†์„ฑ์œผ๋กœ ์ผ๋ฐ˜ props, ComponentEvents ๋งŒ ์ž…๋ ฅ) ๊ทธ๋“ค์€ ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์„ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋†“์ณค์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ์˜ต์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

<script>
  import type { Foo } from './foo';
  export let items: Foo[];
  interface ComponentSlots<T> {}
  interface ComponentEvents<T> {}
</script>

๊ทธ๋Ÿฌ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํƒ€์ดํ•‘ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“ค๊นŒ์š”?

๋„ค, ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@dummdidumm ๊ทธ ๋™์•ˆ interface ComponentSlots {} (์ œ๋„ค๋ฆญ ์ง€์› ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด) ์ง€์› ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋œ ๋‚ด์šฉ๊ณผ ๋ชจ์ˆœ๋˜๋Š” ๋„์ž…์ž…๋‹ˆ๊นŒ?

๊ทธ๋ ‡์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ๊ตฌํ˜„์„ ๊ณ„์†ํ•˜๊ธฐ ์ „์— ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋‹ค๋ฅธ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋กœ๋ถ€ํ„ฐ ๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋จผ์ € RFC๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ํ•ฉ์˜๊ฐ€ ๋˜๋ฉด ๊ทธ๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@joelmukuthu btw ์ธํ„ฐํŽ˜์ด์Šค ์ง€์›์„ ์›ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์Šฌ๋กฏ์— ๋Œ€ํ•œ ์œ ํ˜• ์ถ”๋ก ์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ท€ํ•˜์˜ ์‚ฌ๋ก€๋ฅผ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ RFC๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/sveltejs/rfcs/pull/38
API์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ๊ทธ๊ณณ์—์„œ ๊ณ„์†๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@dummdidumm ์‘๋‹ต์ด ๋Š๋ ค์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ œ ์œ ์Šค ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ง€์›์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์Šฌ๋กฏ์— ๋Œ€ํ•œ ์œ ํ˜• ์ถ”๋ก ์€ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์—„์ฒญ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋‚˜๋Š” ํ˜„์žฌ ์Šฌ๋กฏ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ any๋ผ๋Š” ๊ฒƒ์ด ์Šฌํ”„๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ”„๋กœ์ ํŠธ ๋‚ด์— ์žˆ๊ณ  TS๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์‹œ์ ์—์„œ ์Šฌ๋กฏ ์œ ํ˜•์„ ์•„์ฃผ ๋ฉ‹์ง€๊ฒŒ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์—ฌ๊ธฐ์„œ ์ž˜๋ชป๋œ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์˜ ์˜ˆ:

```html


{option.myLabelProp}

{#๊ฐ ์˜ต์…˜์„ ์˜ต์…˜์œผ๋กœ} {/๊ฐ}

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ง€๊ธˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ any[] ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด string[] ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ์Šฌ๋กฏ์€ string ๋กœ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” "์œ ํ˜•์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Œ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Mark Volkmann์˜ "Svelte and Sapper in Action"์—์„œ ๋งŒ๋‚œ ์œ ํ˜• ๊ฒ€์‚ฌ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ข‹์€ ์ž„์‹œ ์†”๋ฃจ์…˜์€ $$props์™€ ํ•จ๊ป˜ React prop-types ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ํ•  ์ผ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

import PropTypes from "prop-types/prop-types";

const propTypes = {
    text: PropTypes.string.isRequired,
    checked: PropTypes.bool,
};

// Interface for Todo items
export interface TodoInterface {
    id: number;
    text: string;
    checked: boolean;
}

PropTypes.checkPropTypes(propTypes, $$props, "prop", "Todo");

Todo์˜ ์†Œํ’ˆ์„ ํ™•์ธํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ๊บผ์ ธ ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ Todo ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ VSCode์—์„œ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ์™€ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ„์—์„œ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ๋ช…๋ฐฑํ•˜๊ณ  ์ค‘์š”ํ•œ ๋‹จ์ ์€ ์—ฌ๊ธฐ์— ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. propTypes ๊ฐœ์ฒด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์•„์ง ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ์ •์  ๊ฒ€์‚ฌ์™€ props ์œ ํ˜• ๊ฒ€์‚ฌ ๋ชจ๋‘์—์„œ ์ƒ์‚ฐ์ ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(์ธํ„ฐํŽ˜์ด์Šค๋Š” context='module'์— ์ •์˜๋˜์–ด ๊ตฌ์„ฑ ์š”์†Œ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ์™€ ํ•จ๊ป˜ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.)

ํŽธ์ง‘: ์†Œํ’ˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ด์™ธ์˜ ๋‹ค๋ฅธ ์šฉ๋„๋กœ๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์Šฌ๋กฏ/์ด๋ฒคํŠธ์—์„œ๋„ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰