Language-tools: Unerwarteter Fehler beim Zerstören von $store-Werten

Erstellt am 11. Aug. 2020  ·  6Kommentare  ·  Quelle: sveltejs/language-tools

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.
image

System (bitte füllen Sie die folgenden Informationen aus):

  • Betriebssystem: Windows
  • IDE: VSCode (Windows-Linux-Subsystem)
  • Plugin/Paket:

    • Svelte für VSCode

    • schlank-check

    • @tsconfig/svelte

Fixed bug

Alle 6 Kommentare

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

Ja, mehrere Dinge müssen geändert werden. Ich erstelle einen PR-Entwurf, damit Sie meinen aktuellen Stand sehen können.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

NickKaramoff picture NickKaramoff  ·  4Kommentare

maximedupre picture maximedupre  ·  5Kommentare

PatrickG picture PatrickG  ·  3Kommentare

baileyherbert picture baileyherbert  ·  3Kommentare

Kingwl picture Kingwl  ·  6Kommentare