Snippets and their argument types not correctly resolved from generic legacy components
#2716Using a legacy component with slots via snippets, the available snippets may not be resolved correctly and arguments passed to the snippets end up as any
.
<!-- loader.svelte -->
<script lang="ts" generics="T">
interface $$Slots {
default: { value: T },
loaded: { value: T },
loading: { },
error: { error: any },
}
export let promise: Promise<T>;
</script>
{#await promise}
<slot name="loading">
Loading...
</slot>
{:then value}
<slot {value} />
<slot name="loaded" {value} />
{:catch}
Error!
{/await}
<script lang="ts">
import Loader from './loader.svelte';
const delay = (ms: number) => new Promise(resolve => setTimeout(() => resolve(ms), ms));
const promise = delay(1000).then(() => "resolved");
</script>
<Loader promise={promise}>
<!--
Error on `loading`:
Object literal may only specify known properties, and 'loading' does not exist
in type '{ promise: Promise<string>; } & { children?: any; }'. ts(2353)
-->
{#snippet loading()}
Loading text...
{/snippet}
<!--
Error on `value`:
<!-- Binding element 'value' implicitly has an 'any' type. ts(7031)
-->
{#snippet loaded({ value })}
Text: {value}
{/snippet}
{#snippet error()}
Error.
{/snippet}
</Loader>
(The runtime behavior is correct.)
loading
is detected as a valid slot/snippet.value
is generically typed correctly (here string
).Svelte for VS Code extension
Extension & svelte-check
yield same errors.
If the loading
snippet is not there, the next snippet will show an error, only promise
& children
are detected as valid properties.
Hey, guys! Any updates?