Language-tools: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд╕рдВрднрд╡рддрдГ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрджрд░ рдЕрд╢рдХреНрдд рдорд╛рдирддрд╛ рд╣реИ рдЬреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЪреЗрдХ рдХрд░рддреА рд╣реИ

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

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ "рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрднрд╡рддрдГ рд╢реВрдиреНрдп рд╣реИ" рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рд╕рд╢рд░реНрдд рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рдЬрдирди рдХрд░рдирд╛
рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛:

<script lang="typescript">
    interface TestObject {
        author?: string;
    }
    export let test: TestObject | null;
</script>

{#if test}
    <div>
        {#if test.author}
            <div>Author: {test.author}</div>
        {/if}
    </div>
{/if}

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ Object is possibly null рд▓рд╛рдЗрди рдкрд░ {#if test.author} , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ test рдЙрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИред

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░
рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред

рд╕рд┐рд╕реНрдЯрдо (рдХреГрдкрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдкреВрд░реА рдХрд░реЗрдВ):

  • OS: OSX 10.15.7
  • рдЖрдИрдбреАрдИ: VSCode
  • рдкреНрд▓рдЧрдЗрди / рдкреИрдХреЗрдЬ: "VSCode рдХреЗ рд▓рд┐рдП Svelte"

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн
рдпрджрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╕рд╢рд░реНрдд рдХрдерди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ TestObject рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ author? рдХреЛ author (рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП {test.author} рд▓рд┐рдП рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред , рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╕рд╢рд░реНрдд рдХрдерди рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИ, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ test рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред

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

рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ / рд╕рд╛рд░рд╛рдВрд╢:

  • рдЬреИрд╕реЗ рд╣реА рдХреЛрдб рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: #await , #each , let:X ред рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓реЗ рд╣реИрдВ рдФрд░ рдЕрднреА рднреА рдЗрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рдиреЗрд╕реНрдЯреЗрдб рдЕрдЧрд░-рд╢рд░реНрддреЛрдВ рдХреЛ рддрдм рддрдХ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдкрд╣рд▓реА рдЧреЛрд▓реА рдмрд┐рдВрджреБ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдмрд╛рдзрд┐рдд рди рд╣реЛрдВ

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

рдкрддрд╛ рдирд╣реАрдВ рд╣рдо рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред svelte2tsx рдЗрд╕реЗ рдЗрд╕ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

() => (<>

{() => {if (test){<>
    <div>
        {() => {if (test.author){<>
            <div>Author: {test.author}</div>
        </>}}}
    </div>
</>}}}</>);

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

рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЯрд░реНрдирд░реАрдЬрд╝ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рдХреЛрдИ рдФрд░ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИ рддреЛ рд╣рдо рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ - рдпрджрд┐ рдпрд╣ рдЕрднреА рд╣реИ рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ

рд╢рд╛рдпрдж рдЕрдиреБрдорддрд┐ рджреЗрдВ! рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕? {#if test!.author} ред рдпрд╣ рдорд╛рдиреНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрднреА рдЖрдк рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд░реНрд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЕрддрдГ рдЕрд╢рдХреНрдд рд╣реЛрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдЦрд░реАрджрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдКрдкрд░реА рд╕реНрддрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХреЗрдВ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХреЗрдВ

 {() => {if (test && test.author){<>
            <div>Author: {test.author}</div>
        </>}}}

рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди:

<script lang="typescript">
    interface TestObject {
        author?: string;
    }
    export let test: TestObject | null;

    let requitedTest: Required<TestObject>;
    $: {
        requiredTest = test as unknown as Required<TestObject>;
    }
</script>

{#if test}
    <div>
        {#if requiredTest.author}
            <div>Author: {requiredTest.author}</div>
        {/if}
    </div>
{/if}

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

рдЕрдм рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛

{#if test}
    <div>
        {#if test?.author}
            <div>Author: {test.author}</div>
        {/if}
    </div>
{/if}

рдпрд╣ рдХрд╛рдлреА рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░ рдбреНрд░рд┐рд▓рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ:

{#if bigSwitch}
    <div>
        {#if smallSwitch}
            <MyComponent {bigSwitch} />
        {/if}
    </div>
{/if}

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред test && test.author рддрдмред

рдпрджрд┐ рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рдЬрдВрдЬреАрд░ рд╕реЗ рдорддрд▓рдм рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдирдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд╡рд┐рдзрд╛ред рдпрд╣ 3.24.0 рдХреЗ рдмрд╛рдж svelte рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ

рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдпрд╣ рдорд╛рдирд╛ рдХрд┐ рдпрд╣ рдЧреИрд░-рд╢реВрдиреНрдп рдХрдерди foo! рд╕рдорд╛рди TS рд╕реБрд╡рд┐рдзрд╛ рдереАред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдирд╛ :)

рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдЦрд░реАрджрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдКрдкрд░реА рд╕реНрддрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХреЗрдВ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХреЗрдВ

 {() => {if (test && test.author){<>
          <div>Author: {test.author}</div>
      </>}}}

рдореИрдВрдиреЗ рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ #if рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореМрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЗрд╕рдХреЗ рдЕрдВрджрд░ #await #each рдпрд╛ #await рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╡реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрдВрдЧреЗред рдЕрдЧрд░ рдЪрд░ const , рддреЛ рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рдХреНрдпреЛрдВрдХрд┐ TS рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рддрдм рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдЕрднреА рднреА рд╕рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЪрд░ рдХреЛ рдкреБрди: рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╕рдм рдХреБрдЫ const рдЪрд░ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рд╕рднреА рдЪрд░ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рдЕрдиреНрдп рдЪрд░ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣реЛрд╡рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА, рдирд╛рдо, рдЧреЛ-рдЯреВ-рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдПрдБ рд▓рд╛рдПрдЧрд╛, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЙрдорд╛-рдПрдХреНрд╕рдкреНрд░реЗрд╢рдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ {#if foo} рд╕реЗ {#if (foo, generatedConstFoo)} рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛: рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрдЫ рд╣реИрдХрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "рдКрдкрд░реА-рд╕реНрддрд░ рдХреЛ рдмрдврд╝рд╛рдПрдВ рдпрджрд┐ рдмреНрд▓реЙрдХ-" рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИред рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ / рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЕрднреА рднреА рд╕рд╣реА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ ( toUpperCase is not a function ) рдлреЗрдВрдХ рджреЗрдЧрд╛:

<script>
    let name = 'name';
    function setNameToNumber(){
        name = 1
        return ['a']
    }
</script>

{#if name}
    <h1>Hello {name.toUpperCase()}!</h1>
    {#each setNameToNumber() as item}
        item
    {/each}
{/if}

рд╡рд╣реА рд╡реЗрдЯ-рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ / рд╕рд╛рд░рд╛рдВрд╢:

  • рдЬреИрд╕реЗ рд╣реА рдХреЛрдб рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: #await , #each , let:X ред рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓реЗ рд╣реИрдВ рдФрд░ рдЕрднреА рднреА рдЗрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рдиреЗрд╕реНрдЯреЗрдб рдЕрдЧрд░-рд╢рд░реНрддреЛрдВ рдХреЛ рддрдм рддрдХ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдкрд╣рд▓реА рдЧреЛрд▓реА рдмрд┐рдВрджреБ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдмрд╛рдзрд┐рдд рди рд╣реЛрдВ

рдЕрднреА рдЖрдк рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд░реНрд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЕрддрдГ рдЕрд╢рдХреНрдд рд╣реЛрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдЦрд░реАрджрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдКрдкрд░реА рд╕реНрддрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХреЗрдВ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХреЗрдВ

 {() => {if (test && test.author){<>
          <div>Author: {test.author}</div>
      </>}}}

рдЕрдм рдЬрдм рдХрд┐ # 493 рдПрдХ рддрд░рд╣ рд╕реЗ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ $store -variables рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рднреА рд╢рд░реНрддреЛрдВ ( #each рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ:

рдореЗрдВ

{#if somecondition && anothercondition}
   {#each ..}
     ..
   {/each}
{/if}

рдмрд╛рд╣рд░

<>{__sveltets_each((true, items), (item) => (somecondition && anothercondition) && <>
    ...
</>)}</>

рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдлрд╛рд░рд╕ / рдЕрдиреНрдп рдФрд░ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рддрд░реНрдХ рд╕рд╣реА рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдпрд╣ рд╡реАрдПрд╕ рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг 104.6.3 / svelte-check рд╕рдВрд╕реНрдХрд░рдг 1.2.4 рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ - рдпрд╣ рдЕрдм рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдПрдХ рд░рд┐рдкреНрд░реЛ рд╣реИ:

<script lang="ts">
  let value: string | null = null;

  function acceptsString(value: string) {
    console.log(value);
  }
</script>

{#if value}
  <!-- Argument of type 'string | null' is not assignable to parameter of type 'string'.
  Type 'null' is not assignable to type 'string'. -->
  <button on:click={() => acceptsString(value)} />
{/if}

рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рд╣реИ - рдпрд╣ рдЕрдм рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдПрдХ рд░рд┐рдкреНрд░реЛ рд╣реИ:

<script lang="ts">
  let value: string | null = null;

  function acceptsString(value: string) {
    console.log(value);
  }
</script>

{#if value}
  <!-- Argument of type 'string | null' is not assignable to parameter of type 'string'.
  Type 'null' is not assignable to type 'string'. -->
  <button on:click={() => acceptsString(value)} />
{/if}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдирд┐рдпрдорд┐рдд рдЯреАрдПрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдЖрдкрдХреЗ рдорд╛рди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдорд╛рди рд╡рд╛рдкрд╕ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рд╣реА рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ "рдЪреВрдВрдХрд┐ value рдПрдХ рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ", рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ рдХреЛрдИ рдпрд╣ рднреА рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "рдореБрдЭреЗ рдХрднреА рднреА рдЙрд╕ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдХреНрд▓рд┐рдХ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ value null тАЭред рдореБрд╢реНрдХрд┐рд▓ ..

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХреЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЯреАрдПрд╕ рдХреЗ рдЕрдкрдиреЗ, рдкреБрд░рд╛рдиреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд╛рдпрдХ рд╣реИ: рдкреА
рдпрджрд┐ рдореВрд▓реНрдп рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХреЛрдИ рд╕рдВрдХреНрд░рдордг рд╣реИ, рддреЛ рдХреНрдпрд╛ рдмрдЯрди = рдорд╛рди рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдирд╣реАрдВ рд░рд╣реЗрдЧрд╛?

рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдирд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЗрди рдЖрд░рд╛рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

<script lang="ts">
  let foo: string | null = 'bar';
  function getItems() {
     foo = null;
     return [''];
  }
</script>

{#if foo}
  {#each getItems() as item}
    {foo.toUpperCase()} <!-- boom -->
  {/each}
{/if}

.. рд▓реЗрдХрд┐рди рдпрд╣ рдХреМрди рдХрд░рддрд╛ рд╣реИ? рдЖрдк TS рдореЗрдВ рднреА рдЙрд╕реА рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЧрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, btwред рддреЛ рдпрд╣ "рдпрд╣ 100% рд╕рд╣реА рд╣реИ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреАрдПрдХреНрд╕ рдореЗрдВ рдПрдХ рдЯреНрд░реЗрдбрдСрдлрд╝ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ, рдХреГрдкрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ # 876 further рддрдХ рд▓реЗ рдЬрд╛рдПрдВ

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