From 01b104b5f4eaf3e07b14affe0e2953e9f3a83e16 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sun, 20 Sep 2020 12:12:27 +0200 Subject: [PATCH] Typed SvelteComponent interface https://github.com/sveltejs/rfcs/pull/37 --- src/runtime/internal/Component.ts | 11 +++++--- src/runtime/internal/dev.ts | 43 ++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/runtime/internal/Component.ts b/src/runtime/internal/Component.ts index 459a78031a..f6fc91d497 100644 --- a/src/runtime/internal/Component.ts +++ b/src/runtime/internal/Component.ts @@ -212,16 +212,19 @@ if (typeof HTMLElement === 'function') { }; } -export class SvelteComponent { +export class SvelteComponent< + Props extends Record = any, + Events extends Record = any +> { $$: T$$; - $$set?: ($$props: any) => void; + $$set?: ($$props: Partial & Record) => void; $destroy() { destroy_component(this, 1); this.$destroy = noop; } - $on(type, callback) { + $on>(type: K, callback: (e: CustomEvent) => void) { const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); callbacks.push(callback); @@ -231,7 +234,7 @@ export class SvelteComponent { }; } - $set($$props) { + $set($$props: Partial & Record) { if (this.$$set && !is_empty($$props)) { this.$$.skip_bound = true; this.$$set($$props); diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index 28daa03ae8..ee32fe5778 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -97,23 +97,52 @@ export function validate_slots(name, slot, keys) { } } -type Props = Record; -export interface SvelteComponentDev { - $set(props?: Props): void; - $on(event: string, callback: (event: CustomEvent) => void): () => void; +export interface SvelteComponentDev< + Props extends Record = any, + Events extends Record = any, + Slots extends Record = any +> { + $set(props?: Partial & Record): void; + $on>(type: K, callback: (e: CustomEvent) => void): () => void; $destroy(): void; [accessor: string]: any; } -export class SvelteComponentDev extends SvelteComponent { +export class SvelteComponentDev< + Props extends Record = any, + Events extends Record = any, + Slots extends Record = any +> extends SvelteComponent { + /** + * @private + * For type checking capabilities only. + * Does not exist at runtime. + * ### DO NOT USE! + */ + $$prop_def: Props; + /** + * @private + * For type checking capabilities only. + * Does not exist at runtime. + * ### DO NOT USE! + */ + $$events_def: Events; + /** + * @private + * For type checking capabilities only. + * Does not exist at runtime. + * ### DO NOT USE! + */ + $$slot_def: Slots; + constructor(options: { target: Element; anchor?: Element; - props?: Props; + props?: Props & Record; hydrate?: boolean; intro?: boolean; $$inline?: boolean; - }) { + }) { if (!options || (!options.target && !options.$$inline)) { throw new Error(`'target' is a required option`); }