typescript - Hur fungerar @type import('./$types') kommentar-syntax i SvelteKit?
Jag lär mig för närvarande SvelteKit och stötte på lite kod vars syntax jag inte förstår.
I +page.server.ts förstår jag inte denna syntax:
/** @type {import('./$types').PageServerLoad} */
För mitt otränade öga ser det ut som om det bara är utkommenterat, men /** */ gör något som säkerställer att det fungerar. Ingen aning.
Svar #1
SvelteKit genererar en .svelte-kit-katalog varje gång du kör ett dev- eller build-kommando. I denna katalog finns många filer som genereras för prerendering och även typdefinitioner. Dessa definitioner ger dig autokomplettering och felkontroll i textredigerare som stöder TypeScript.
$types är en alias för motsvarande $types.d.ts typspecificeringsfil i .svelte-kit/types/src/routes/...-mappen.
Dessa typer kan importeras, så att din textredigerare kan förstå typerna för din load-funktion. Typerna kan importeras på två sätt:
A. JSDoc-kommentar + TypeScript-specifika importtyper
Låt oss säga att du har en page.server.ts-fil i filvägen src/routes/blog/[slug]. Detta ger dig autokomplettering och typkontroll på params-objektet som ses nedan.
/** @type {import('./$types').PageServerLoad} */
export const load = async ({ params }) => {
params.slug // autocompletes, no error
params.snail
// ^^^^^ error: Property 'snail' does not
// exist on type 'RouteParams'
}
Detta ser ut som en vanlig JSDoc-kommentar men funktionen import() är specifik för TypeScript. Mer om det finns i TypeScript Handbook (tack till jonrsharpe för att ha nämnt länken).
JSDoc-kommentarer kan vara begränsade. Det verkar stödja annotering av moduler.
B. TypeScript-typanteckning
Om du använder TypeScript kan du också använda en annan syntax:
import type { PageServerLoad } from './$types';
export const load: PageServerLoad = async ({ params }) => {
// ...
}
Vidare läsning (om hur TypeScript integreras i textredigerare/IDE:er):
- https://github.com/sveltejs/language-tools
- https://github.com/typescript-language-server/typescript-language-server
- https://microsoft.github.io/language-server-protocol/
