From 359b3ecf8c89fec657e44909b1513ce65383e06c Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sat, 25 Sep 2021 23:51:32 +0200 Subject: [PATCH] [feat] add convenience SvelteComponentConstructor type Eases typing "this is a variable that expects a Svelte component constructor (of a certain shape)". Removes the need for SvelteComponentTyped to be an extra type so it can be deprecated in v4 and removed in v5, and SvelteComponent(Dev) can receive the same generic typings as SvelteComponetTyped in v4. --- CHANGELOG.md | 4 ++++ src/runtime/index.ts | 3 ++- src/runtime/internal/dev.ts | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54a678accb..278de46650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Svelte changelog +## Unreleased + +* Add `SvelteComponentConstructor` convenience type ([#6770](https://github.com/sveltejs/svelte/pull/6770)) + ## 3.43.0 * Use export map to expose no-op versions of lifecycle functions for SSR ([#6743](https://github.com/sveltejs/svelte/pull/6743)) diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 8e12f9f0ee..31d77d15ac 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -12,5 +12,6 @@ export { tick, createEventDispatcher, SvelteComponentDev as SvelteComponent, - SvelteComponentTyped + SvelteComponentTyped, + SvelteComponentConstructor } from 'svelte/internal'; diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts index 76d68086c8..3590a9a7cd 100644 --- a/src/runtime/internal/dev.ts +++ b/src/runtime/internal/dev.ts @@ -247,6 +247,22 @@ export class SvelteComponentTyped< } } +/** + * Convenience-type to represent a Svelte component constructor. + * + * Example: + * ```ts + import ASvelteComponent from './ASvelteComponent.svelte'; + const ComponentClass: SvelteComponentConstructor = ASvelteComponent; + new ComponentClass(..); + ``` + */ +export type SvelteComponentConstructor< + Props extends Record = any, + Events extends Record = any, + Slots extends Record = any +> = new (options: IComponentOptions) => SvelteComponentTyped; + export function loop_guard(timeout) { const start = Date.now(); return () => {