์ด์ ๋ํด ์ด๋ฏธ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ (#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
ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ด์ง๋ง ์ค์ ๋ก ๋ฐํ์์ ์ฌ๋กฏ์ ์ฝ์ ํ ์ ์๋ ๊ฒ์ ๋ํ 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'์ ์ ์๋์ด ๊ตฌ์ฑ ์์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ํจ๊ป ๋ด๋ณด๋ผ ์ ์์ง๋ง ๊ฐ๊ฒฐํจ์ ์ํด ํด๋น ๋ถ๋ถ์ ์๋ตํ์ต๋๋ค.)
ํธ์ง: ์ํ ์ ํจ์ฑ ๊ฒ์ฌ ์ด์ธ์ ๋ค๋ฅธ ์ฉ๋๋ก๋ ์ด๊ฒ์ ์๋ํ์ง ์์์ต๋๋ค. ์ฌ๋กฏ/์ด๋ฒคํธ์์๋ ์๋ํ๋์ง ์๋ ค์ฃผ์ธ์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ง๋ ์ฌ๊ธฐ์ ์๋ชป๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋๋ฉด ์ ๊ฐ ๋ญ๊ฐ ์๋ชปํ ๊ฒ๋ฟ์ ๋๋ค.
๋ด๊ฐ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์ ์:
```html
{option.myLabelProp}