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.
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>
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:
npx degit sveltejs/template svelte-app
cd svelte-app
node ./scripts/setupTypeScript.js
src/ClickTracker.svelte
mit folgendem Inhalt:<script>
export function track() {
clicks++;
}
let clicks = 0;
</script>
<p>Clicks: {clicks}</p>
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>
src/App.svelte
: Property 'track' does not exist on type 'ClickTracker__SvelteComponent_'
Kann ich nicht reproduzieren, funktioniert bei mir.
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.