Language-tools: $ storeλ₯Ό μ‚¬μš©ν•  λ•Œ if / {# if} λ‚΄λΆ€μ˜ Typescript μ œμ–΄ 흐름이 μž‘λ™ν•˜μ§€ μ•ŠμŒ

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

λ‹€μŒκ³Ό 같이 μ •μ˜ 된 μƒμ μ΄μžˆλŠ” 경우 :

import { readable, Readable } from "svelte/store"

const post: Readable<Post|null> = readable(null, /* some code that loads the post asynchronously */)

그런 λ‹€μŒ ν…œν”Œλ¦Ώμ— λ‹€μŒμ„ μž‘μ„±ν•©λ‹ˆλ‹€.

<h1>{$post.title}</h1>

그런 λ‹€μŒ typescript κ²€μ‚¬κΈ°λŠ” Object is possibly 'null' μ˜¬λ°”λ₯΄κ²Œ λΆˆν‰ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ μ΄λ ‡κ²Œν•˜λ©΄ 였λ₯˜κ°€ μ‚¬λΌμ§ˆ 수 있기λ₯Ό λ°”λžμŠ΅λ‹ˆλ‹€.

{#if $post !== null}
    <h1>{$post.title}</h1>
{/if}

κ·ΈλŸ¬λ‚˜ 그것은 μ „ν˜€ νš¨κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ–΄λ–€ μ’…λ₯˜κ°€ λ§μ΄λ˜λŠ”μ§€. λ‚˜λŠ” typescriptκ°€ 그것이 if- λ¬Έμ΄λΌλŠ” 것을 μ΄ν•΄ν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆμŒμ„ μ΄ν•΄ν•©λ‹ˆλ‹€.

이것이 μ‹€μ œλ‘œ κ΅¬ν˜„ν•˜λŠ” 것이 μ‚¬μ†Œν•˜μ§€ μ•Šμ„ 것이라고 상상할 수 μžˆμ§€λ§Œ, 정말 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

Fixed bug

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

κ·Έ λ™μ•ˆ 둜컬 λ³€μˆ˜μ— 재 ν• λ‹Ήν•˜λŠ” 것이 ν•΄κ²° 방법이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

$: storeValue = $store

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

λ¬Έμ œλŠ”

{#if $post !== null}
    <h1>{$post.title}</h1>
{/if}

(μš°λ¦¬κ°€ svelte2tsx λ₯Ό 톡해 λͺ¨λ“  지λŠ₯적인 μž₯점을 μœ„ν•΄)

if (__sveltets_store_get(post) !== null){<>
    <h1>{__sveltets_store_get(post).title}</h1>
</>}

λ³΄μ‹œλ‹€μ‹œν”Ό 상점 μ•‘μ„ΈμŠ€λŠ” __sveltets_store_get ν•¨μˆ˜λ‘œ λ³€ν™˜λ˜λ―€λ‘œ TS의 μ œμ–΄ 흐름은 이것이 μ •μ˜λ˜μ§€ μ•Šμ€ / 널이 μ•„λ‹Œμ§€ κ²°μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ 첫 번째 __sveltets_store_get κ°€ λ³€μˆ˜μ— ν• λ‹Ή 된 λ‹€μŒ if λ²”μœ„ λ‚΄μ—μ„œ μ‚¬μš©λ˜λŠ” λ°©μ‹μœΌλ‘œμ΄λ₯Ό λ³€ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€.

μ’‹μ•„μš”,이게 κ°€λŠ₯ν• κΉŒμš”? πŸ˜‡

λ‚˜λ„ κ·Έλ ‡κ²Œ 생각해

ν‘œμ€€ Sapper ν…œν”Œλ¦Ώμ— Typescript 지원을 μΆ”κ°€ν•˜λ €κ³  ν•  λ•Œ λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€κ³  λ§ν•˜λŠ” μ£Όμ„μž…λ‹ˆλ‹€.

Discord #sapper 채널에 λŒ€ν•œ λ‚΄ κ²Œμ‹œλ¬Ό μ—μ„œ :

질문이 μžˆμŠ΅λ‹ˆλ‹€.

Svelte Typescript 지원은 {#each cat as cats} 와 같은 HTML λΈ”λ‘μœΌλ‘œ ν™•μž₯λ©λ‹ˆκΉŒ?

슀크린 샷은 ν‘œμ€€ Sapper ν…œν”Œλ¦Ώμ— λŒ€ν•΄ Typescriptλ₯Ό μΌ  ν›„ svelte-checkμ—μ„œ κ°€μ Έμ˜¨ κ²ƒμž…λ‹ˆλ‹€.

Screen Shot 2020-09-03 at 9 03 34

λ‹€μŒμ€ src/routes/blog/index.svelte 의 κ΄€λ ¨ μ½”λ“œ 슀 λ‹ˆνŽ«μž…λ‹ˆλ‹€.

<ul>
    {#each posts as post}
        <!-- we're using the non-standard `rel=prefetch` attribute to
                tell Sapper to load the data for the page as soon as
                the user hovers over the link or taps it, instead of
                waiting for the 'click' event -->
        <li><a rel='prefetch' href='blog/{post.slug}'>{post.title}</a></li>
    {/each}
</ul>

그리고 svelte-check의 κ΄€λ ¨ 였λ₯˜ ( tsconfig.json strict: false μ—μ„œλ„) :

/Users/paul/dev/solidrevolution_svelte-sapper/src/routes/blog/index.svelte:32:42
Error: Property 'slug' does not exist on type 'unknown'. (ts)
                waiting for the 'click' event -->
        <li><a rel='prefetch' href='blog/{post.slug}'>{post.title}</a></li>
    {/each}


/Users/paul/dev/solidrevolution_svelte-sapper/src/routes/blog/index.svelte:32:55
Error: Property 'title' does not exist on type 'unknown'. (ts)
                waiting for the 'click' event -->
        <li><a rel='prefetch' href='blog/{post.slug}'>{post.title}</a></li>
    {/each}

posts μœ ν˜•μ„ λͺ¨λ₯΄λŠ” 경우 λ¬Έμ œκ°€ 무엇인지 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ²Œμ‹œλ¬Όμ„ μ•Œ 수 없도둝 슀크립트 νƒœκ·Έμ˜ posts λ³€μˆ˜μ— λŒ€ν•΄ μœ ν˜• μ–΄μ„€ μ…˜μ„ μˆ˜ν–‰ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

각 λΈ”λ‘μ˜ λͺ©λ‘μ΄ ArrayLike μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν•œ κ·Έλ‘œλΆ€ν„° μš”μ†Œ μœ ν˜•μ„ μΆ”λ‘  ν•  수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

κ·Έ λ™μ•ˆ 둜컬 λ³€μˆ˜μ— 재 ν• λ‹Ήν•˜λŠ” 것이 ν•΄κ²° 방법이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

$: storeValue = $store

상점 값을 λ³€μˆ˜λ‘œ μΆ”μΆœν•˜μ—¬μ΄λ₯Ό κ΅¬ν˜„ν•  λ•Œ 염두에 두어야 ν•  사항 :

  • μ €μž₯μ†Œ λ³€μˆ˜ 이름 변경은 λ‚˜μ€‘μ— 계속 μž‘λ™ν•©λ‹ˆλ‹€.
  • "$ x is not a store"μœ ν˜• 였λ₯˜λŠ” λ‚˜μ€‘μ— 계속 μž‘λ™ν•©λ‹ˆλ‹€.

λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€λ§Œ 맀μž₯이 μ—†μŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ :

<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}

{#if test.author} 쀄에 "Object is possible null"였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

λ™μΌν•œ λ¬Έμ œμž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ λ‹€λ₯Έ λ²„κ·Έμž…λ‹ˆκΉŒ?

엄격 λͺ¨λ“œμ—μ„œλŠ”이 μ˜¬λ°”λ₯Έ λ™μž‘, 당신은 μž…λ ₯μž…λ‹ˆλ‹€ test κ°€λŠ₯ν•˜κ²Œλ˜λŠ” λ“±μ˜ null 였λ₯˜κ°€ 올 수 μžˆλ„λ‘. test κ°€ λ¨Όμ € μ •μ˜λ˜μ—ˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€.

엄격 λͺ¨λ“œμ—μ„œ 이것은 μ˜¬λ°”λ₯Έ λ™μž‘μ€ μ‚¬μš©μžκ°€ μž…λ ₯μž…λ‹ˆλ‹€ test 같은 κ°€λŠ₯μ„± μ‹œμž‘ null 였λ₯˜κ°€ 올 수 μžˆλ„λ‘. test κ°€ λ¨Όμ € μ •μ˜λ˜μ—ˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€.

κ·Έ 전에 {#if test} μˆ˜ν‘œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ£„μ†‘ν•©λ‹ˆλ‹€. λ„ˆλ¬΄ 빨리 λŒ€λ‹΅ν–ˆμŠ΅λ‹ˆλ‹€. 예, 이것은 λ‹€λ₯Έ λ¬Έμ œμž…λ‹ˆλ‹€. λ‹€λ₯Έ 티켓을 μ—΄ 수 μžˆμŠ΅λ‹ˆκΉŒ?

물둠이야. μ—΄κΈ° 전에 쀑볡이 μ•„λ‹Œμ§€ ν™•μΈν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. :)

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„! 이것에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

이 λ¬Έμ œλŠ” VS Code Svelte ν™•μž₯ 버전 104.4.4 및 svelte-check 버전 1.1.36으둜 μˆ˜μ •λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. svelte-check 경우 TypeScript 4.2 이상도 ν•„μš”ν•©λ‹ˆλ‹€.

μ§€κΈˆ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ μ•Œλ €μ£Όμ„Έμš”. 맀μž₯ μ‚¬μš©κ³Ό κ΄€λ ¨μ΄μ—†λŠ” μ œμ–΄ 흐름 λ¬Έμ œκ°€ μ—¬μ „νžˆ μ‘΄μž¬ν•˜λ©° # 619μ—μ„œ μΆ”μ λ©λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” VS Code Svelte ν™•μž₯ 버전 104.4.4 및 svelte-check 버전 1.1.36으둜 μˆ˜μ •λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. svelte-check 경우 TypeScript 4.2 이상도 ν•„μš”ν•©λ‹ˆλ‹€.

μ§€κΈˆ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ μ•Œλ €μ£Όμ„Έμš”. 맀μž₯ μ‚¬μš©κ³Ό κ΄€λ ¨μ΄μ—†λŠ” μ œμ–΄ 흐름 λ¬Έμ œκ°€ μ—¬μ „νžˆ μ‘΄μž¬ν•˜λ©° # 619μ—μ„œ μΆ”μ λ©λ‹ˆλ‹€.

그것은 λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€! 재 지원 해킹을 제거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.

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