Beschreibe den Fehler
Die Anweisung $: ({ value } = $store);
ist gültige Syntax, wenn value
eine Eigenschaft von $store
und $store
ein Svelte-Speicher ist. Es verhält sich wie eine normale Destrukturierung und reagiert auf das Speichern von Aktualisierungen. Dies führt zu einem Fehler, wenn lang="ts"
.
# App.svelte
------------
<script lang="ts">
import data from "./store";
$: ({ count } = $data);
</script>
jd:/svelte-playground $ yarn svelte-check [0:30]
yarn run v1.22.4
warning package.json: No license field
$ /home/jd/Projects/svelte-playground/node_modules/.bin/svelte-check
Loading svelte-check in workspace: /home/jd/Projects/svelte-playground
Getting Svelte diagnostics...
====================================
/home/jd/Projects/svelte-playground/src/App.svelte:3:9
Error: No value exists in scope for the shorthand property 'count'. Either declare one or provide an initializer. (ts)
;
$: ({ count } = $data
====================================
svelte-check found 1 error and 0 warnings
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Reproduzieren
1) Beginnen Sie mit dieser REPL: Link
2) Laden Sie es herunter und fügen Sie dem Projekt TS-Unterstützung hinzu: Link
3) Ändern Sie App.svelte
indem Sie lang="ts"
zum öffnenden <script>
Tag hinzufügen. (siehe obiges Ausschnitt)
4) laufe svelte-check
Erwartetes Verhalten
Dies ist die gültige Svelte/JS-Syntax und sein Code läuft einwandfrei. Es sollte keine Typechecker-Fehler erzeugen.
Screenshots
Fügen Sie gegebenenfalls Screenshots hinzu, um Ihr Problem zu erklären.
System (bitte füllen Sie die folgenden Informationen aus):
Problemumgehung
Verwenden Sie keine Destrukturierung für Svelte-Speicher in Typescript. Dies ist nicht ideal, aber kein Blocker. Es ist nur weniger prägnant, wenn mehrere Eigenschaften gleichzeitig destrukturiert werden.
REPL: Link
# App.svelte
------------
<script lang="ts">
import data from "./store";
$: count = $data;
</script>
Natürlich können Sie sich jederzeit direkt im DOM auf den Store-Wert beziehen, um reaktive Updates anzuzeigen.
Von Eingang
<script lang="ts">
import data from "./store";
$: ({ count } = $data);
</script>
<main>
<h1>Count (inline): {$data.count}</h1>
<h1>Count (reactive destructure): {count}</h1>
<button on:click={() => data.update(c => ({count: c.count + 1}))}>
Increment
</button>
</main>
svelte2tsx
generiert die Ausgabe:
<></>;
import data from "./store";
function render() {
;() => {$: ({ count } = __sveltets_store_get(data));}
;
() => (<>
<main>
<h1>Count (inline): {__sveltets_store_get(data).count}</h1>
<h1>Count (reactive destructure): {count}</h1>
<button onclick={() => data.update(c => ({count: c.count + 1}))}>
Increment
</button>
</main> </>);
return { props: {}, slots: {}, getters: {}, events: {} }}
export default class extends createSvelte2TsxComponent(__sveltets_partial(render)) {
}
Das Problem ist, dass die $
-Zuweisung in eine Funktion eingeschlossen ist, sodass der Wert außerhalb seines Gültigkeitsbereichs nicht existiert.
Wir müssen möglicherweise überprüfen, wie der schlanke Compiler bestimmt, wann er eine Variable deklarieren soll, um zu sehen, ob wir eine andere Situation übersehen
Das Problem ist die ts AST-Analyse. Es führt nur die let x = ...
Transformation durch, wenn es sich um einen binären Ausdruck handelt, aber in diesem Fall handelt es sich um einen binären Ausdruck, der in einen eingeklammerten Ausdruck eingeschlossen ist.
Edit: Ich bin gerade dabei, das Problem zu beheben - all diese Wenn-dann-auch-denke-an-diese-Ecke-Fall-Checks machen meinen Verstand verschwommen
Ich denke, der linke Haken muss auch geändert werden
Ja, mehrere Dinge müssen geändert werden. Ich erstelle einen PR-Entwurf, damit Sie meinen aktuellen Stand sehen können.