TypeScript Improvements

+15 Mana ✨

Svelte 5 has significantly better TypeScript support. Take advantage of it!

Typed Props

svelte
<script lang="ts">
  type Props = {
    name: string;
    count?: number;
    onsubmit: (data: FormData) => void;
    children: import('svelte').Snippet;
  };
  
  let { name, count = 0, onsubmit, children }: Props = $props();
</script>

Typed State

svelte
<script lang="ts">
  type User = {
    id: number;
    name: string;
    email: string;
  };
  
  let user = $state<User | null>(null);
  let users = $state<User[]>([]);
</script>

Typed Derived

svelte
<script lang="ts">
  let items = $state<Item[]>([]);
  
  // Type is inferred!
  let activeItems = $derived(items.filter(i => i.active));
  // activeItems: Item[]
</script>

Typed Effects

svelte
<script lang="ts">
  let count = $state(0);
  
  // TypeScript knows count is number
  $effect(() => {
    const doubled = count * 2; // No error
    console.log(doubled);
  });
</script>

Component Typing

svelte
<script lang="ts">
  import type { HTMLAttributes } from 'svelte/elements';
  
  type Props = HTMLAttributes<HTMLButtonElement> & {
    variant?: 'primary' | 'secondary';
  };
  
  let { variant = 'primary', ...rest }: Props = $props();
</script>

<button class="btn-{variant}" {...rest} />

Snippet Typing

svelte
<script lang="ts">
  import type { Snippet } from 'svelte';
  
  type Props = {
    header: Snippet;
    row: Snippet<[item: Item, index: number]>;
    footer?: Snippet;
  };
  
  let { header, row, footer }: Props = $props();
</script>

šŸ“– TypeScript guide

āœ“ Completed