Language-tools: Exportierte Funktionen im Autovervollständigungsmenü anzeigen

Erstellt am 15. Juli 2020  ·  8Kommentare  ·  Quelle: sveltejs/language-tools

Bezieht sich Ihre Funktionsanfrage auf ein Problem?
Beim Binden an eine Komponenteninstanz möchte ich, dass alle exportierten Funktionen für die automatische Vervollständigung verfügbar sind.

Beschreiben Sie die gewünschte Lösung
Gegeben sind folgende Komponenten:

<!-- App.svelte -->
<script>
  import ClickTracker from "./ClickTracker.svelte";

  let componentRef;
</script>

<main>
  <ClickTracker bind:this={componentRef} />
  <button on:click={componentRef.track}>Click me</button>
</main>

<!-- ClickTracker.svelte -->
<script>
  export function track() {
    clicks++;
  }

  let clicks = 0;
</script>

<p>Clicks: {clicks}</p>

Wenn ich mit componentRef , möchte ich die Funktion track im Autovervollständigungsmenü anzeigen.
image

Zusätzlicher Kontext
Wenn TypeScript mit svelte-preprocess verwendet wird, wird beim Verweisen auf die track-Funktion die Warnung "Property 'track' is not exist on type 'ClickTracker__SvelteComponent_'.ts(2339)" unter der componentRef.track Referenz angezeigt. Ich denke das könnte zusammenhängen.

<!-- App.svelte -->
<script lang="ts">
  import ClickTracker from "./ClickTracker.svelte";

  let componentRef: ClickTracker;
</script>

<main>
  <ClickTracker bind:this={componentRef} />
  <button on:click={componentRef.track}>Click me</button>
</main>
Fixed enhancement

Hilfreichster Kommentar

Die neue VSCode-Plugin-Version wurde gerade veröffentlicht, möglicherweise wurde Ihre IDE noch nicht aktualisiert. Die neueste Version ist 101.4.0.

Alle 8 Kommentare

Ich hatte ein ähnliches Problem und habe die folgende Problemumgehung gefunden, obwohl es für meinen Geschmack zu viel Code ist

<!-- ClickTracker.svelte -->
<script context='module' lang='ts'>
  export type ClickTrackerType =  SvelteComponent & { track(): void }
</script>
[...]

Dann von App.svelte :

<!-- App.svelte -->
<script lang='ts'>
  import ClickTracker from "./ClickTracker.svelte";
  import type { ClickTrackerType }  from "./ClickTracker.svelte";

  let componentRef: ClickTrackerType;
</script>

Auf der anderen Seite fand ich bei der Inspektion von vscode a

Hm, ja, das ist ein guter Workaround. Obwohl es definitiv mehr Code ist, als ideal ist. Mir gefällt auch nicht, dass Änderungen an der Funktion track() auch manuelle Aktualisierungen des exportierten Typs erfordern würden.

@geoffrich natürlich ist es nur ein Workaround, bis dieses Problem behoben ist. Die Unterstützung von Typoskript bedeutet, dass svelte die Eingaben für meine eigene Svelte-Komponente korrekt generieren kann.

Für mich wäre die ideale Syntax ungefähr so:

let componentRef: ClickTracker

und das ist es...

Wurde das gelöst? Wenn ich das ClickTracker-Beispiel mit Typoskript ausprobiere, bekomme ich immer noch die folgende Fehlermeldung:

Property 'track' does not exist on type 'ClickTracker__SvelteComponent_'.ts(2339)

Ich arbeite mit dem Skript setupeNode.js, das kürzlich aus sveltejs/template erstellt wurde.

Das sind meine devDependencies

  "devDependencies": {
    "@rollup/plugin-commonjs": "^12.0.0",
    "@rollup/plugin-node-resolve": "^8.0.0",
    "rollup": "^2.3.4",
    "rollup-plugin-livereload": "^1.0.0",
    "rollup-plugin-svelte": "^5.0.3",
    "rollup-plugin-terser": "^5.1.2",
    "svelte": "^3.0.0",
    "svelte-check": "^0.1.0",
    "svelte-preprocess": "^4.0.0",
    "@rollup/plugin-typescript": "^4.0.0",
    "typescript": "^3.9.3",
    "tslib": "^2.0.0",
    "@tsconfig/svelte": "^1.0.0"
  },

Die neue VSCode-Plugin-Version wurde gerade veröffentlicht, möglicherweise wurde Ihre IDE noch nicht aktualisiert. Die neueste Version ist 101.4.0.

Exzellent!!!

@opensas @dummdidumm Ich

Svelte-Plugin: 104.9.1

Schritte zum Reproduzieren:

  • Richten Sie eine neue schlanke Typoskript-App ein:
npx degit sveltejs/template svelte-app
cd svelte-app
node ./scripts/setupTypeScript.js
  • Erstellen Sie eine neue Datei src/ClickTracker.svelte mit folgendem Inhalt:
<script>
    export function track() {
        clicks++;
    }

    let clicks = 0;
</script>

<p>Clicks: {clicks}</p>
  • Ändern Sie src/App.svelte wie folgt:
<script lang="ts">
    import ClickTracker from "./ClickTracker.svelte";

    let componentRef: ClickTracker;
</script>

<main>
    <ClickTracker bind:this={componentRef} />
    <button on:click={componentRef.track}>Click me</button>
</main>
  • Beachten Sie den Fehler in src/App.svelte : Property 'track' does not exist on type 'ClickTracker__SvelteComponent_'

Kann ich nicht reproduzieren, funktioniert bei mir.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen