λ²κ·Έ μ€λͺ
μ€μ²© λ μ‘°κ±΄λΆ κ²μ¬μ λν΄ TypeScript μ€λ₯ "κ°μ²΄κ° null μΌ μ μμ"μ΄ νμλ©λλ€.
μ¬ννλ €λ©΄
κ°λ¨ν ν
μ€νΈ μΌμ΄μ€ :
<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
κ·Έ μμ λΌμΈ.
μμλλ νλ
μ€λ₯κ° λ°μνμ§ μμ κ²μΌλ‘ μμλ©λλ€.
μμ€ν (λ€μ μ 보λ₯Ό μμ±νμμμ€) :
μΆκ° 컨ν
μ€νΈ
μ€μ²© λ μ‘°κ±΄λ¬Έμ΄ μ κ±°λκ³ TestObject μΈν°νμ΄μ€μμ author?
κ° author
(νμν κ²½μ°)λ‘ λ°λλ©΄ TypeScriptκ° {test.author}
λν΄ λμΌν μ€λ₯λ₯Ό λ°μμν€λ κ²μ΄ λ
Όλ¦¬μ μ
λλ€. ,νμ§λ§ κ·Έλ μ§ μμ΅λλ€. λ°λΌμ TypeScriptκ° test
κ° nullμ΄ μλμ μμ§ λͺ»νλ©΄ μ€μ²© λ 쑰건문μ μν΄ μ€λ₯κ° νΈλ¦¬κ±° λ κ²μ²λΌ 보μ
λλ€.
μ°λ¦¬κ° κ·Έκ²μ μ²λ¦¬νκΈ° μν΄ λ¬΄μμ ν μ μλμ§ λͺ¨λ¦ λλ€. svelte2tsxλ λ€μκ³Ό κ°μ΄ λ³νν©λλ€.
() => (<>
{() => {if (test){<>
<div>
{() => {if (test.author){<>
<div>Author: {test.author}</div>
</>}}}
</div>
</>}}}</>);
μ μ΄ νλ¦ μ ν λΆμμ΄ μ μ©λμ§ μλλ‘ ν¨μμ λνλμ΄ μκΈ° λλ¬Έμ λλ€. κ·Έλ¦¬κ³ μ°λ¦¬λ ν¨μλ₯Ό μ κ±°νκ±°λ μ¦μ νΈμΆ λ ν¨μλ‘ λν ν μ μμ΅λλ€. μλνλ©΄ μ’ μμ±μ΄ μ ν λ λ ννμμ΄ λ€μ μ€νλκΈ° λλ¬Έμ λλ€. μ°λ¦¬λ νμ€ν μΌλΆ μ μ΄ νλ¦ μ νμ 무ν¨νν΄μΌν©λλ€.
μ΄κ²μ μΌμμΌλ‘ λ°κΏ μ μμ΅λκΉ? else λΈλ‘μ΄ μμΌλ©΄ else μΌμ΄μ€μ λΉ λ¬Έμμ΄μ μ¬μ©ν©λλ€.
κ·Έλ¬λ λ ν° λ¬Έμ λ μ°λ¦¬κ° μ΄λ€ λ³νμμλ μ΄μ κ°μ κΈ°λ₯μ μ¬μ©ν μ μλ€λ κ²μ
λλ€.
μ΄μ©λ©΄ νμ©! ν΅μ¬λ‘ ? {#if test!.author}
μ΄κ²μ μ ν¨ν TypeScript ꡬ문μ΄μ§λ§ μ§κΈμ ν
νλ¦Ώμμ μ¬μ©ν μ μμ΅λλ€.
μ§κΈμ λ§ν¬ μ
μμ typescriptλ₯Ό μ¬μ©ν μ μμ΅λλ€. λ§ν¬ μ
μ μ μ²λ¦¬νκ±°λ μ»΄νμΌλ¬κ° typescript ꡬ문μ ꡬ문 λΆμνλλ‘νλ λ°©λ²μ μμ΅λλ€. λ°λΌμ λμ΄ μλ μ£Όμ₯μ λΆκ°λ₯ν©λλ€.
μμ‘΄ κ°λ₯μ± κ΅¬λ§€λ₯Ό μλνμ§ μμ μΌλ©΄ μμ μμ€ μ‘°κ±΄μ 볡μ¬νμ¬ μ€μ²© 쑰건 μμ μΆκ° ν μ μμ΅λλ€.
{() => {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}
μλνμ§ μμ΅λλ€. TypeScriptλ ν νλ¦Ώμμ νμ©λμ§ μμ΅λλ€.
μ¬κΈ°μ μΌνλ κ² κ°μ΅λλ€. κ·Έλ¬λ©΄ test && test.author
.
μ νμ 체μ΄λμ μλ―Ένλ κ²½μ° μ΄λ λ¨μ§ typescript κΈ°λ₯μ΄ μλλΌ μλ‘μ΄ μλ° μ€ν¬λ¦½νΈ κΈ°λ₯μ λλ€. 3.24.0 μ΄ν svelteμμ μ¬μ©ν μ μμ΅λλ€.
κ°μ¬! λλ νμ κ·Έκ²μ΄ nullμ΄ μλ λ¬Έ foo!
κ³Ό μ μ¬ν TS κΈ°λ₯μ΄λΌκ³ κ°μ νμ΅λλ€. κ·Έκ²μ ν¨μ¬ λ κ°λ¨ν©λλ€.
νμ μλ‘μ΄ κ²μ λ°°μ°μμμ€ :)
μμ‘΄ κ°λ₯μ± κ΅¬λ§€λ₯Ό μλνμ§ μμ μΌλ©΄ μμ μμ€ μ‘°κ±΄μ 볡μ¬νμ¬ μ€μ²© 쑰건 μμ μΆκ° ν μ μμ΅λλ€.
{() => {if (test && test.author){<> <div>Author: {test.author}</div> </>}}}
λλ κ·Έ λ°©ν₯μΌλ‘ λͺ κ°μ§ ν
μ€νΈλ₯Ό μννμΌλ©° μ΄κ²μ΄ λͺ¨λ κ²½μ°μ μλνμ§ μμ κ²μ΄λΌκ³ μκ°ν©λλ€. #if
λν μ€λ₯λ₯Ό μ°¨λ¨ν μ μμ§λ§ κ·Έ μμ #each
λλ #await
λΈλ‘μ μ¬μ©νλ μ¦μ λ€μ λνλ©λλ€. μ΄λ¬ν μ€λ₯λ λ³μκ° const
μΈ κ²½μ° λνλμ§ μμ΅λλ€. TS μ μ΄ νλ¦μ λ³μλ₯Ό λ€μ ν λΉ ν μ μκΈ° λλ¬Έμ μ‘°κ±΄μ΄ μ¬μ ν μ°Έμ΄μ΄μΌνλ€λ κ²μ μκ³ μκΈ° λλ¬Έμ
λλ€. λ°λΌμμ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ°μ₯ μ’μ λ°©λ²μ λͺ¨λ λ³μλ₯Ό const
λ³μλ‘ λ³ννκ±°λ λͺ¨λ λ³μλ₯Ό ν
νλ¦Ώμ μμ λ€λ₯Έ λ³μμ λ€μ ν λΉνλ κ²μ
λλ€. νΈλ² μ 보, μ΄λ¦ λ°κΎΈκΈ°, μ μΈμΌλ‘ μ΄λ λ±μ κ²½μ° μ체 λ¬Έμ κ° λ°μν©λλ€. μλ§λ μΌν μμ μ¬μ©νμ¬ {#if foo}
λ₯Ό {#if (foo, generatedConstFoo)}
λ³ννμ¬ ν΄κ²°ν μ μμ΅λλ€. κ²°λ‘ : μ΄κ²μ κ½€ λ§μ ν΄μ»€ 리λ₯Ό νμλ‘ ν κ²μ
λλ€.
κ²°κ΅ "μμ μμ€μ if λΈλ‘ μΆκ°"κ° μ¬λ°λ₯Έ κ²μΌ μλ μμ΅λλ€. κ° / λκΈ° λΈλ‘ λ΄μμ μ‘°κ±΄μ΄ μ¬μ ν μ°Έμ΄λΌκ³ κ°μ νλ κ²μ μμ νμ§ μμ΅λλ€. μλ₯Ό λ€μ΄ λ°νμ μ€λ₯ ( 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
ꡬ문 μ€ νλμ ν¬ν¨λλ μ¦μ μ¬μ€μ λ©λλ€. μ΄λ μ½λλ₯Ό λ³νν΄μΌνλ λ°©μ λλ¬Έμ
λλ€. μ°λ¦¬λμ΄ λ¬Έμ λ₯Ό μμ§ μμμΌλ©° μ¬μ νμ΄ λ¬Έμ λ₯Ό μ’μ λ°©λ²μΌλ‘ ν΄κ²°ν λ°©λ²μ μ°Ύκ³ μμ΅λλ€.μ§κΈμ λ§ν¬ μ μμ typescriptλ₯Ό μ¬μ©ν μ μμ΅λλ€. λ§ν¬ μ μ μ μ²λ¦¬νκ±°λ μ»΄νμΌλ¬κ° typescript ꡬ문μ ꡬ문 λΆμνλλ‘νλ λ°©λ²μ μμ΅λλ€. λ°λΌμ λμ΄ μλ μ£Όμ₯μ λΆκ°λ₯ν©λλ€.
μμ‘΄ κ°λ₯μ± κ΅¬λ§€λ₯Ό μλνμ§ μμ μΌλ©΄ μμ μμ€ μ‘°κ±΄μ 볡μ¬νμ¬ μ€μ²© 쑰건 μμ μΆκ° ν μ μμ΅λλ€.{() => {if (test && test.author){<> <div>Author: {test.author}</div> </>}}}
μ΄μ # 493μ΄ $store
λ³μλ₯Ό μ μΈνλ λ°©μμΌλ‘ μμ λμμΌλ―λ‘μ΄ μμ΄λμ΄λ₯Ό λ€μ μ΄ν΄λ³Ό μ μμ΅λλ€. λ΄ μκ°μ λ€μκ³Ό κ°μ λͺ¨λ if 쑰건μ μμ μΆκ°νλ κ²μ
λλ€ (μ : #each
).
μ
{#if somecondition && anothercondition}
{#each ..}
..
{/each}
{/if}
λ°
<>{__sveltets_each((true, items), (item) => (somecondition && anothercondition) && <>
...
</>)}</>
κΉλ€λ‘μ΄ λΆλΆμ elseif / else λ° μ€μ²© λ Όλ¦¬λ₯Ό μ¬λ°λ₯΄κ² μ»λ κ²μ λλ€.
μ΄ λ¬Έμ λ VS Code λ²μ 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}
κ·Έκ²μ λ¨μ§ μΌλ°μ μΈ TS νλμ λλ€. κ°μ΄ nullλ‘ λμκ° μμλ λ―Έλμ μΈμ λ μ§ νΈμΆ λ μμλ ν¨μμμ κ°μ΄ μ°Έμ‘°λ©λλ€.
λ λ€ μ ν¨ν보기μ
λλ€. " value
λ constκ° μλκΈ° λλ¬Έμ λ³κ²½ λ μ μμ΅λλ€."λΌκ³ λ§ν μ μμ§λ§ λ€λ₯Έ ννΈμΌλ‘λ " value
κ° null
μ΄λ©΄ ν΄λΉ ν΄λ¦ νΈλ€λ¬λ₯Ό μ¬μ©ν μ μμ΅λλ€."λΌκ³ λ§ν μλ μμ΅λλ€.
μ΄μ λν΄ λ€λ₯Έ λ¬Έμ λ₯Ό μ΄μ΄μ λ³λλ‘ λ Όμ ν κ²μ λλ€.
TS μ체μ μ€λλ μ νμ λν΄ λ
Όμ ν μκ°μ΄ μΆ©λΆνμ§ μλ€κ³ μκ°ν©λλ€.
μλ₯Ό λ€μ΄ ν΄λΉ λλ λΆλͺ¨ μμ€μμ μμ μ νμ΄μλ κ²½μ° λ²νΌμ΄ 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. λ°λΌμ DXμμλ "μ΄κ²μ 100 % μ νν©λλ€"λ³΄λ€ νΈλ μ΄λ μ€νμ κ°κΉμ΅λλ€.
κ·Έλ¬λ μ¬κΈ°μμ λ μμΈν λ ΌμνκΈ° μ μμ΄ λ Όμλ₯Ό # 876μΌλ‘ κ°μ Έ κ°μμμ€ π
κ°μ₯ μ μ©ν λκΈ
μκ·λͺ¨ μ λ°μ΄νΈ / μμ½ :
#await
,#each
,let:X
ꡬ문 μ€ νλμ ν¬ν¨λλ μ¦μ μ¬μ€μ λ©λλ€. μ΄λ μ½λλ₯Ό λ³νν΄μΌνλ λ°©μ λλ¬Έμ λλ€. μ°λ¦¬λμ΄ λ¬Έμ λ₯Ό μμ§ μμμΌλ©° μ¬μ νμ΄ λ¬Έμ λ₯Ό μ’μ λ°©λ²μΌλ‘ ν΄κ²°ν λ°©λ²μ μ°Ύκ³ μμ΅λλ€.