From 44f23d2ccf9c82cdcaaf3d6f271f9393327becb8 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 2 May 2024 17:55:00 +0200 Subject: [PATCH] fix: adjust order of `derived` function definition overloads Turns out the order is crucial for not getting a type error fixes #11415 --- .changeset/giant-bananas-turn.md | 5 +++++ packages/svelte/src/store/index.js | 4 ++-- packages/svelte/tests/types/store.ts | 14 ++++++++++++++ packages/svelte/types/index.d.ts | 4 ++-- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 .changeset/giant-bananas-turn.md diff --git a/.changeset/giant-bananas-turn.md b/.changeset/giant-bananas-turn.md new file mode 100644 index 0000000000..df4f40e5a8 --- /dev/null +++ b/.changeset/giant-bananas-turn.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: adjust order of `derived` function definition overloads diff --git a/packages/svelte/src/store/index.js b/packages/svelte/src/store/index.js index e6a2f0a6d3..108af184b0 100644 --- a/packages/svelte/src/store/index.js +++ b/packages/svelte/src/store/index.js @@ -111,7 +111,7 @@ export function writable(value, start = noop) { * @template T * @overload * @param {S} stores - * @param {(values: import('./private.js').StoresValues) => T} fn + * @param {(values: import('./private.js').StoresValues, set: (value: T) => void, update: (fn: import('./public.js').Updater) => void) => import('./public.js').Unsubscriber | void} fn * @param {T} [initial_value] * @returns {import('./public.js').Readable} */ @@ -124,7 +124,7 @@ export function writable(value, start = noop) { * @template T * @overload * @param {S} stores - * @param {(values: import('./private.js').StoresValues, set: (value: T) => void, update: (fn: import('./public.js').Updater) => void) => import('./public.js').Unsubscriber | void} fn + * @param {(values: import('./private.js').StoresValues) => T} fn * @param {T} [initial_value] * @returns {import('./public.js').Readable} */ diff --git a/packages/svelte/tests/types/store.ts b/packages/svelte/tests/types/store.ts index a6e681898c..af1bb65ea9 100644 --- a/packages/svelte/tests/types/store.ts +++ b/packages/svelte/tests/types/store.ts @@ -11,3 +11,17 @@ derived([a], ([aVal]) => { aVal === ''; return aVal === true; }); + +derived( + a, + (value, set) => { + set('works'); + // @ts-expect-error + set(true); + + value === true; + // @ts-expect-error + value === ''; + }, + '' +); diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 7bfdee575c..a4bea89bc8 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -2157,14 +2157,14 @@ declare module 'svelte/store' { * * https://svelte.dev/docs/svelte-store#derived * */ - export function derived(stores: S, fn: (values: StoresValues) => T, initial_value?: T | undefined): Readable; + export function derived(stores: S, fn: (values: StoresValues, set: (value: T) => void, update: (fn: Updater) => void) => Unsubscriber | void, initial_value?: T | undefined): Readable; /** * Derived value store by synchronizing one or more readable stores and * applying an aggregation function over its input values. * * https://svelte.dev/docs/svelte-store#derived * */ - export function derived(stores: S, fn: (values: StoresValues, set: (value: T) => void, update: (fn: Updater) => void) => Unsubscriber | void, initial_value?: T | undefined): Readable; + export function derived(stores: S, fn: (values: StoresValues) => T, initial_value?: T | undefined): Readable; /** * Takes a store and returns a new one derived from the old one that is readable. *