Skip to content

Commit 7468286

Browse files
authored
fix: allow undefined and null values for #each in Svelte 5 (#2863)
* fix: allow `undefined` and `null` values for `#each` in Svelte 5 * switch
1 parent 71c0d98 commit 7468286

File tree

5 files changed

+35
-4
lines changed

5 files changed

+35
-4
lines changed

.changeset/short-pugs-kick.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'svelte-check': patch
3+
'svelte2tsx': patch
4+
---
5+
6+
fix: allow `undefined` and `null` values for `#each` in Svelte 5

packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/each/expected_svelte_4.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,22 @@
3232
"message": "Argument of type 'number' is not assignable to parameter of type 'ArrayLike<unknown> | Iterable<unknown>'.",
3333
"code": 2345,
3434
"tags": []
35+
},
36+
{
37+
"range": {
38+
"start": {
39+
"line": 38,
40+
"character": 7
41+
},
42+
"end": {
43+
"line": 38,
44+
"character": 21
45+
}
46+
},
47+
"severity": 1,
48+
"source": "ts",
49+
"message": "Argument of type 'number[] | null | undefined' is not assignable to parameter of type 'ArrayLike<unknown> | Iterable<unknown>'.\n Type 'undefined' is not assignable to type 'ArrayLike<unknown> | Iterable<unknown>'.",
50+
"code": 2345,
51+
"tags": []
3552
}
3653
]

packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/each/expected_svelte_5.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"severity": 1,
1414
"source": "ts",
15-
"message": "Argument of type '{}' is not assignable to parameter of type 'ArrayLike<unknown> | Iterable<unknown>'.",
15+
"message": "Argument of type '{}' is not assignable to parameter of type 'ArrayLike<unknown> | Iterable<unknown> | null | undefined'.",
1616
"code": 2345,
1717
"tags": []
1818
},
@@ -29,7 +29,7 @@
2929
},
3030
"severity": 1,
3131
"source": "ts",
32-
"message": "Argument of type 'number' is not assignable to parameter of type 'ArrayLike<unknown> | Iterable<unknown>'.",
32+
"message": "Argument of type 'number' is not assignable to parameter of type 'ArrayLike<unknown> | Iterable<unknown> | null | undefined'.",
3333
"code": 2345,
3434
"tags": []
3535
}

packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/each/input.svelte

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ interface OptionObject {
66
77
const simpleOptions: number[] = [];
88
const complexOptions: string[] | OptionObject[] = [];
9-
9+
const maybeUndefined: number[] | undefined | null = null as any;
1010
const badOptions = {
1111
object: {},
1212
number: 1,
@@ -34,3 +34,8 @@ const badOptions = {
3434
{#each badOptions.number as option, i}
3535
<div>{option} {i}</div>
3636
{/each}
37+
38+
<!-- Fine in Svelte 5, error in Svelte 4 -->
39+
{#each maybeUndefined as option, i (i)}
40+
<div>{option}, {i}</div>
41+
{/each}

packages/svelte2tsx/svelte-shims-v4.d.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,10 @@ declare function __sveltets_2_ensureComponent<
250250
: never
251251
>;
252252

253-
declare function __sveltets_2_ensureArray<T extends ArrayLike<unknown> | Iterable<unknown>>(array: T): T extends ArrayLike<infer U> ? U[] : T extends Iterable<infer U> ? Iterable<U> : any[];
253+
declare function __sveltets_2_ensureArray<T extends ArrayLike<unknown> | Iterable<unknown>>(
254+
// Svelte 5 allows undefined or null here, Svelte 4 doesn't
255+
array: T | (typeof import('svelte') extends { mount: any } ? (undefined | null) : never)
256+
): T extends ArrayLike<infer U> ? U[] : T extends Iterable<infer U> ? Iterable<U> : any[];
254257

255258
type __sveltets_2_PropsWithChildren<Props, Slots> = Props &
256259
(Slots extends { default: any }

0 commit comments

Comments
 (0)