Svelte 4 Writable Store
// fooStore.ts
import { type Writable, writable } from "svelte/store";
function createFoo() {
const { subscribe, set, update }: Writable<number> = writable(0);
return {
subscribe,
set: (value: number) => set(value),
add: (value: number) => update((x: number) => x + value),
triple: () => update((x: number) => x * 3),
clear: () => set(0),
};
}
export const foo = createFoo();Derived store:
// fooStore.ts
import { derived, writable } from "svelte/store";
export const bar = writable(1);
export const baz = writable(2);
export const foo = derived(
[bar, baz],
([$bar, $baz]) => Math.min($bar, $baz) / 2,
);Svelte 5 Rune Store
// foo.svelte.ts (must be placed inside a *.svelte.ts file)
function createFoo(initialCount = 0) {
let foo = $state(initialCount);
return {
get foo() {
return foo;
},
set foo(value) {
foo = value;
},
add(value) {
foo += value;
},
triple() {
foo *= 3;
},
};
}
export const foo = createFoo();Or class if you prefer:
// foo.svelte.ts
export class Foo {
foo = $state(0);
constructor(initialCount = 0) {
this.foo = initialCount;
}
add(value) {
this.foo += value;
}
triple() {
this.foo *= 3;
}
}
export const foo = new Foo();Class doesn’t need get/set method, just read/write it directly:
// In a component:
// Reading:
console.log(foo.foo);
// Writing (triggers UI updates automatically):
foo.foo = 10;Derived rune:
// foo.svelte.ts (must be placed inside a *.svelte.ts file)
function createFoo(initialBar = 1, initialBaz = 2) {
let bar = $state(initialBar);
let baz = $state(initialBaz);
let foo = $derived(Math.min(bar, baz) / 2);
return {
get bar() {
return bar;
},
set bar(value) {
bar = value;
},
get baz() {
return baz;
},
set baz(value) {
baz = value;
},
get foo() {
return foo;
},
};
}
export const foo = createFoo();