Language-tools: рдЯрд╛рдЗрдкрд┐рдВрдЧ Svelte рдХрдВрдкреЛрдиреЗрдВрдЯ рдкреНрд░реЙрдкреНрд╕/рдЗрд╡реЗрдВрдЯреНрд╕/рд╕реНрд▓реЙрдЯреНрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдЕрдЧре░ 2020  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sveltejs/language-tools

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдореБрджреНрджреЗ рд╣реИрдВ (#424, #304, #273, #263), рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореЗрдХрд┐рдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд╣рдо рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдмрдВрдзрд┐рдд рдкреАрдЖрд░: #437

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ d.ts рдлрд╝рд╛рдЗрд▓ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдПрдЧреАред

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?
рдлрд┐рд▓рд╣рд╛рд▓ рдХреБрдЫ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рдШрдЯрдХ рдХреЗ рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ:

  • рдкреНрд░реЙрдкреНрд╕ рдФрд░ рдЗрд╡реЗрдВрдЯ/рд╕реНрд▓реЙрдЯ (рдЬреЗрдиреЗрд░рд┐рдХ) рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ
  • рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ
  • рд╕реНрд▓реЙрдЯ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ

рдЖрдк рдЬреЛ рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдкреНрд░реЙрдкреНрд╕/рдИрд╡реЗрдВрдЯ/рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ред

рдкреНрд░рд╕реНрддрд╛рд╡: рдПрдХ рдирдпрд╛ рдЖрд░рдХреНрд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ComponentDef рдЬрд┐рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдХреЛрдб рд╕реЗ рдЪреАрдЬреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдШрдЯрдХ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг (рдХреНрдпрд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде):

<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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╢рд╛рдпрдж рдореИрдВ рдпрд╣рд╛рдБ рдЧрд▓рдд рд╢рдмреНрджреЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ... рдпрд╛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рдЬреЛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

```рдПрдЪрдЯреАрдПрдордПрд▓


{option.myLabelProp}

{#рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ} {/рдкреНрд░рддреНрдпреЗрдХ}

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕реНрд▓реЙрдЯ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрд╡реЗрд▓реНрдЯ рдореБрджреНрджрд╛ рд╣реИред https://github.com/sveltejs/svelte/issues/2588 рдФрд░ рдПрдХ рдкреАрдЖрд░ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ https://github.com/sveltejs/svelte/pull/4296 , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрд╡рд░рд▓реИрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЕрд╡рд╕рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ (рдпрджрд┐ рдХреЛрдИ рд╕рд╣рдорддрд┐ рд╣реИ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рдХреБрдЫ рдмрдХрд╛рдпрд╛ рдкреНрд░рд╢реНрди рд╣реИрдВ)ред

рдкреАрдЖрд░ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрддрд░ рдкрд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХрд╛ рдЗрдВрдбреЗрдВрдЯ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдкред
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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

рдЬреЛ рдЯрд╛рдЗрдкрдЪреЗрдХ рдХреЗ рджреМрд░рд╛рди 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 рдирд┐рдХрд╛рд▓рдХрд░ред

рдпрджреНрдпрдкрд┐ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ "рдореИрдВ рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рдкреНрд░реЛрдк рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрдВрдз рдЪрд╛рд╣рддрд╛ рд╣реВрдВ" рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдо рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдЕрдЪреНрдЫрд╛ рд╣реИред рдПрдХ рддрд░рдл рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ "рд╣рд╛рдБ рд╣рдо рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ", рджреВрд╕рд░реА рддрд░рдл рдпрд╣ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдЖрдк рдПрдХ рд╣реА рдХрд╛рдо рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) - рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ interface ComponentDef<T>{ props: {} } рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рдкрдВрдХреНрддрд┐рдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд░рд┐рдПрдХреНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ Svelte рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд░ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдордЬрд╝реЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ)ред

рдореБрдЭреЗ @halfnelson рдХреА рд╕реЛрдЪ рдкрд╕рдВрдж рд╣реИред рдирд┐рд░реНрдпрд╛рдд рдХреЛ рд╕рд╣рд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдмрд╛рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рдПрдХ рдФрд░ рддреНрд╡рд░рд┐рдд, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ: рдореБрдЭреЗ @template рд╡рд┐рдХрд▓реНрдк рд╕рд╣рд┐рдд рдЪреАрдЬреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSDoc рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рд╣реБрдИ рд╣реИред

рдЬрдмрдХрд┐ рд╣рдореЗрдВ JSDoc (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ HTML рдХреЗ рднреАрддрд░ JSDoc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП) рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рджрд┐рдорд╛рдЧ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐, рдЪрд╛рд╣реЗ WebStorm рдпрд╛ VS рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ true рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдЕрдЧрд░ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ Record<keyof X, any> рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рджреАрд╡рд╛рд░реЛрдВ рдореЗрдВ рднрд╛рдЧрддрд╛ рд░рд╣рддрд╛ рд╣реВрдВред @template рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реАрдорд┐рдд рднреА рдерд╛ред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдИрдбреАрдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднреА рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ (jsx) рддрддреНрд╡ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдиреЛ-рдЧреЛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдиреНрдп svelte рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдирд░рд┐рдХ рдЧреБрдгреЛрдВ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдореИрдВ рдХреЗрд╡рд▓ рд╕реНрд▓реЙрдЯ/рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╢реНрд░рд┐рдд рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред рдпрджрд┐ рд╡реЗ рдЗрдирдкреБрдЯ рдЧреБрдгреЛрдВ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдЬреЗрдирд┐рдХреНрд╕ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЗрдирд┐рдХреНрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо svelte2tsx рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреАрдПрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ред

рдЯрд╛рдЗрдкрд┐рдВрдЧ рдУрд╡рд░рд╣реЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рд╕рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рдЖрдк рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░/рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдИрд╡реЗрдВрдЯ/рд╕реНрд▓реЙрдЯ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдо рдпрд╣ рд╕рдм рд╕реНрд╡рдпрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдард┐рди рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ #263 рдЬреИрд╕реЗ рдЙрдиреНрдирдд рд╕реНрд▓реЙрдЯ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди, рдФрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдирд╛ (рдЬреЛ рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ createEventDispatcher рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ createEventDispatcher рд╕рд╛рдорд╛рди рд▓рдкреЗрдЯрддрд╛ рд╣реИ)ред

рдЖрдо рддреМрд░ рдкрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рд▓реЛрдЧ рдХреЗрд╡рд▓ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж "рдкреНрд░рдХрд╛рд░ рдХрдо" рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рд╕реНрд╡реЗрд▓реНрдЯ рдХреА рднрд╛рд╡рдирд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛:

  • ComponentDef рдпрд╣ рд╕рдм-рдореЗрдВ-рдПрдХ-рдЕрдЧрд░-рдЖрдк-рдХреА рдЬрд░реВрд░рдд рд╣реИ-рдпрд╣ рд╣реИ
  • ComponentEvents рдХреЗрд╡рд▓ рдИрд╡реЗрдВрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ
  • ComponentSlots рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рд╣реИ
  • рдПрдХ рдирд┐рд░реНрдорд╛рдг рдЬреИрд╕реЗ <script generic="T"> рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • ComponentEvents/ComponentSlots/generic="T" . рдХрд╛ рд╕рдВрдпреЛрдЬрди

@shirakaba JSDoc рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрдиреНрди рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдХ рдЯрд╛рдЗрдк рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕реЗ рдЙрдиреНрдирдд рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд▓реЙрдЯ рдкреНрд░реЙрдкреНрд╕ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╣реИрдХ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдЕрдЪреНрдЫрд╛ рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рдорд┐рд▓реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдШрдЯрдХ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ:

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

рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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

рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрд▓реЙрдЯ рдХреЛ . рдореЗрдВ рдмрджрд▓реЗрдВ

<DeafaultSlot />

(рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд▓реНрд▓рд╛рдирд╛) рдореЗрд░реЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рд╣реИред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдо generic рдкреНрд░реЛрдк рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЪрд░ рдХреЗрд╡рд▓ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВ, рдкреНрд░реЛрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдбреАрдПрдХреНрд╕ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЙрд╕ рдиреЛрдЯ рдкрд░, рдХреНрдпрд╛ generic="T" рдХреЗ рдмрдЬрд╛рдп generic="T" export type T рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

рдпрд╣ рдЕрдорд╛рдиреНрдп TS рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рд╡рд░реНрддрди рдХрджрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдпрджрд┐ рд╕реНрд╡реЗрд▓реНрдЯреЗ рдШрдЯрдХ рдПрдХ рдЧреИрд░-рд╕рдВрдХрд▓рди рдпреЛрдЧреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рддреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднрд╛рд╖рд╛-рдЙрдкрдХрд░рдг рд╡рд╛рдкрд╕ рд╡рд╣реА рдЖрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЕрдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рд░реБрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЕрдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╛ "рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд/рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░" рддреНрд░реБрдЯрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ? рдореИрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ script рдЯреИрдЧ рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрд░рдХреНрд╖рдг рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рдЬреЗрдиреЗрд░рд┐рдХ" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рдХреЗ рд╕рд╛рде :)

рд╕рдм рдХреБрдЫ, рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЪрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ (рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб)ред

рдЬрдм рдЖрдк export type T; рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ TS рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП? export type T extends string; рдЖрдк рдкрд░ рдЕрдзрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХреЗрдЧрд╛ред рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрдкрдХреЗ рдЖрд░рдХреНрд╖рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рд╣реИред рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ T1 рдпрд╛ T2 рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИ (рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП?)ред

рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкреВрд░реЗ рдШрдЯрдХ рдХреЛ ComponentDef рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд╣рд╛рдВ рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╢реБрд░реБрдЖрддреА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдореЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдХреАрдордд рдкрд░ рдЖрддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЪрд░реНрдЪрд╛ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреА рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЕрд▓рдЧ рд░рд╛рдп рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ( ComponentDef , рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЙрдкреНрд╕, рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдХрд░рдирд╛ ComponentEvents ) рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓рдЪреАрд▓рд╛ рд╣реИ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдЦреБрд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

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

рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдУрд╡рд░рд╣реЗрдб рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛?

рд╣рд╛рдБ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

@dummdidumm рдХреНрдпрд╛ рдЗрд╕ рджреМрд░рд╛рди interface ComponentSlots {} (рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛) рдХреЗ рд╕рдорд░реНрдерди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдпрд╛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдмрд╛рддреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛрдЧрд╛?

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкрд░ рд╕рдореБрджрд╛рдп рдФрд░ рдЕрдиреНрдп рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдПрдХ рдЖрд░рдПрдлрд╕реА рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рдмрд╛рд░ рд╕рдордЭреМрддрд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред

@joelmukuthu btw рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рд╣рдордиреЗ рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЛ рдмрдврд╝рд╛рдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрднреА рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореИрдВ рдЖрдкрдХрд╛ рдорд╛рдорд▓рд╛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред

рдореИрдВрдиреЗ рдЕрдм рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ RFC рдмрдирд╛рдпрд╛ рд╣реИ: https://github.com/sveltejs/rfcs/pull/38
рд╡рд╣рд╛рдВ рдПрдкреАрдЖрдИ рдкрд░ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рд╣рдиреА рдЪрд╛рд╣рд┐рдПред

@dummdidumm рдзреАрдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрд▓реЙрдЯ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛! рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреБрдЦреА рд╣реВрдВ рдХрд┐ рд╕реНрд▓реЙрдЯ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдХреЛрдИ рднреА рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдЕрдЬреАрдм рд╣реИ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕реНрд▓реЙрдЯ рдХрд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдШрдЯрдХ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рднреАрддрд░ рд╣реИ рдФрд░ рдЯреАрдПрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдореИрдВ рдпрд╣рд╛рдБ рдЧрд▓рдд рд╢рдмреНрджреЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ... рдпрд╛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рдЬреЛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

```рдПрдЪрдЯреАрдПрдордПрд▓


{option.myLabelProp}

{#рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ} {/рдкреНрд░рддреНрдпреЗрдХ}

рдареАрдХ рд╣реИ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ, рд╣рд╛рдБ рдЕрднреА рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ any[] рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ string[] рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд▓реЙрдЯ string рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ"ред

рдорд╛рд░реНрдХ рд╡реЛрд▓реНрдХрдореИрди рджреНрд╡рд╛рд░рд╛ "рд╕реНрд╡реЗрд▓реНрдЯреЗ рдПрдВрдб рд╕реИрдкрд░ рдЗрди рдПрдХреНрд╢рди" рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЪреЗрдХрд┐рдВрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди $$ рдкреНрд░реЛрдк рдХреЗ рд╕рд╛рде рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЛрдк-рдЯрд╛рдЗрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЯреЛрдбреЛ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:

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");

рдЬрдмрдХрд┐ рдореИрдВ рдЯреЛрдбреЛ рдХреЗ рдкреНрд░реЛрдк рдХреЛ рдорд╛рдиреНрдп рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рднреА рдЯреЛрдбреЛ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдореИрдВ рд╡реАрдПрд╕рд╕реАрдУрдбреА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдореЗрдВ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХреВрдВред рдпрд╣ рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ propTypes рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рдореИрдВ рдЕрднреА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╢реБрд░реБрдЖрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЧрд▓рдд рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХрд┐рд╕реА рднреА рдЙрддреНрдкрд╛рджрдХ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕реНрдерд┐рд░ рдЬрд╛рдВрдЪ рдФрд░ рдкреНрд░реЛрдк рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рджреЛрдиреЛрдВред

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрджрд░реНрдн = 'рдореЙрдбреНрдпреВрд▓' рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдШрдЯрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдпрд╛рдд рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреНрд░реЛрдк рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрд▓реЙрдЯ/рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

MDoder97 picture MDoder97  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

canadaduane picture canadaduane  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

PatrickG picture PatrickG  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

opensas picture opensas  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

baileyherbert picture baileyherbert  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ