@@ -128,7 +128,7 @@ export interface SvelteComponentDev {
128
128
$destroy ( ) : void ;
129
129
[ accessor : string ] : any ;
130
130
}
131
- interface IComponentOptions < Props extends Record < string , any > = Record < string , any > > {
131
+ export interface ComponentConstructorParams < Props extends Record < string , any > = Record < string , any > > {
132
132
target : Element | ShadowRoot ;
133
133
anchor ?: Element ;
134
134
props ?: Props ;
@@ -164,7 +164,7 @@ export class SvelteComponentDev extends SvelteComponent {
164
164
*/
165
165
$$slot_def : any ;
166
166
167
- constructor ( options : IComponentOptions ) {
167
+ constructor ( options : ComponentConstructorParams ) {
168
168
if ( ! options || ( ! options . target && ! options . $$inline ) ) {
169
169
throw new Error ( "'target' is a required option" ) ;
170
170
}
@@ -256,26 +256,47 @@ export class SvelteComponentTyped<
256
256
*/
257
257
$$slot_def : Slots ;
258
258
259
- constructor ( options : IComponentOptions < Props > ) {
259
+ constructor ( options : ComponentConstructorParams < Props > ) {
260
260
super ( options ) ;
261
261
}
262
262
}
263
263
264
264
/**
265
- * Convenience-type to represent a Svelte component constructor.
265
+ * Convenience type to get the type of a Svelte component. Useful for example in combination with
266
+ * dynamic components and `<svelte:element>`.
266
267
*
267
268
* Example:
268
- * ```ts
269
- import ASvelteComponent from './ASvelteComponent.svelte';
270
- const ComponentClass: SvelteComponentConstructor = ASvelteComponent;
271
- new ComponentClass(..);
272
- ```
269
+ * ```html
270
+ * <script lang="ts">
271
+ * import { ComponentType, SvelteComponentTyped } from 'svelte';
272
+ * import Component1 from './Component1.svelte';
273
+ * import Component2 from './Component2.svelte';
274
+ *
275
+ * const component: ComponentType = someLogic() ? Component1 : Component2;
276
+ * const componentOfCertainSubType: ComponentType<SvelteComponentTyped<{needsThisProp: string}>> = someLogic() ? Component1 : Component2;
277
+ * </script>
278
+ *
279
+ * <svelte:element this={component} />
280
+ * <svelte:element this={componentOfCertainSubType} needsThisProp="hello" />
281
+ * ```
273
282
*/
274
- export type SvelteComponentConstructor <
275
- Props extends Record < string , any > = any ,
276
- Events extends Record < string , any > = any ,
277
- Slots extends Record < string , any > = any
278
- > = new ( options : IComponentOptions < Props > ) => SvelteComponentTyped < Props , Events , Slots > ;
283
+ export type ComponentType < T extends SvelteComponentTyped = SvelteComponentTyped < any , any , any > > =
284
+ new ( p : ComponentConstructorParams < T extends SvelteComponentTyped < infer X , any , any > ? X : any > ) => T ;
285
+
286
+ /**
287
+ * Convenience type to get the properties the given component expects. Example:
288
+ * ```html
289
+ * <script lang="ts">
290
+ * import { ComponentProps } from 'svelte';
291
+ * import Component from './Component.svelte';
292
+ *
293
+ * const props: ComponentProps<Component> = { foo: 'bar' }; // Errors if these aren't the correct props
294
+ * </script>
295
+ * ```
296
+ */
297
+ export type ComponentProps < T extends SvelteComponent > = T extends SvelteComponentTyped < infer Props >
298
+ ? Props
299
+ : unknown ;
279
300
280
301
export function loop_guard ( timeout ) {
281
302
const start = Date . now ( ) ;
0 commit comments