@@ -157,10 +157,13 @@ export function construct_svelte_component_dev(component, props) {
157
157
}
158
158
}
159
159
160
- type Props = Record < string , any > ;
161
- export interface SvelteComponentDev {
162
- $set ( props ?: Props ) : void ;
163
- $on ( event : string , callback : ( ( event : any ) => void ) | null | undefined ) : ( ) => void ;
160
+ export interface SvelteComponentDev <
161
+ Props extends Record < string , any > = any ,
162
+ Events extends Record < string , any > = any ,
163
+ Slots extends Record < string , any > = any // eslint-disable-line @typescript-eslint/no-unused-vars
164
+ > {
165
+ $set ( props ?: Partial < Props > ) : void ;
166
+ $on < K extends Extract < keyof Events , string > > ( type : K , callback : ( ( e : Events [ K ] ) => void ) | null | undefined ) : ( ) => void ;
164
167
$destroy ( ) : void ;
165
168
[ accessor : string ] : any ;
166
169
}
@@ -177,8 +180,33 @@ export interface ComponentConstructorOptions<Props extends Record<string, any> =
177
180
178
181
/**
179
182
* Base class for Svelte components with some minor dev-enhancements. Used when dev=true.
183
+ *
184
+ * Can be used to create strongly typed Svelte components.
185
+ *
186
+ * ### Example:
187
+ *
188
+ * You have component library on npm called `component-library`, from which
189
+ * you export a component called `MyComponent`. For Svelte+TypeScript users,
190
+ * you want to provide typings. Therefore you create a `index.d.ts`:
191
+ * ```ts
192
+ * import { SvelteComponent } from "svelte";
193
+ * export class MyComponent extends SvelteComponent<{foo: string}> {}
194
+ * ```
195
+ * Typing this makes it possible for IDEs like VS Code with the Svelte extension
196
+ * to provide intellisense and to use the component like this in a Svelte file
197
+ * with TypeScript:
198
+ * ```svelte
199
+ * <script lang="ts">
200
+ * import { MyComponent } from "component-library";
201
+ * </script>
202
+ * <MyComponent foo={'bar'} />
203
+ * ```
180
204
*/
181
- export class SvelteComponentDev extends SvelteComponent {
205
+ export class SvelteComponentDev <
206
+ Props extends Record < string , any > = any ,
207
+ Events extends Record < string , any > = any ,
208
+ Slots extends Record < string , any > = any
209
+ > extends SvelteComponent {
182
210
/**
183
211
* @private
184
212
* For type checking capabilities only.
@@ -192,16 +220,16 @@ export class SvelteComponentDev extends SvelteComponent {
192
220
* Does not exist at runtime.
193
221
* ### DO NOT USE!
194
222
*/
195
- $$events_def : any ;
223
+ $$events_def : Events ;
196
224
/**
197
225
* @private
198
226
* For type checking capabilities only.
199
227
* Does not exist at runtime.
200
228
* ### DO NOT USE!
201
229
*/
202
- $$slot_def : any ;
230
+ $$slot_def : Slots ;
203
231
204
- constructor ( options : ComponentConstructorOptions ) {
232
+ constructor ( options : ComponentConstructorOptions < Props > ) {
205
233
if ( ! options || ( ! options . target && ! options . $$inline ) ) {
206
234
throw new Error ( "'target' is a required option" ) ;
207
235
}
@@ -221,82 +249,21 @@ export class SvelteComponentDev extends SvelteComponent {
221
249
$inject_state ( ) { }
222
250
}
223
251
224
- // TODO https://github.com/microsoft/TypeScript/issues/41770 is the reason
225
- // why we have to split out SvelteComponentTyped to not break existing usage of SvelteComponent.
226
- // Try to find a better way for Svelte 4.0.
227
-
252
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
228
253
export interface SvelteComponentTyped <
229
254
Props extends Record < string , any > = any ,
230
255
Events extends Record < string , any > = any ,
231
- Slots extends Record < string , any > = any // eslint-disable-line @typescript-eslint/no-unused-vars
232
- > {
233
- $set ( props ?: Partial < Props > ) : void ;
234
- $on < K extends Extract < keyof Events , string > > ( type : K , callback : ( ( e : Events [ K ] ) => void ) | null | undefined ) : ( ) => void ;
235
- $destroy ( ) : void ;
236
- [ accessor : string ] : any ;
237
- }
256
+ Slots extends Record < string , any > = any
257
+ > extends SvelteComponentDev < Props , Events , Slots > { }
258
+
238
259
/**
239
- * Base class to create strongly typed Svelte components.
240
- * This only exists for typing purposes and should be used in `.d.ts` files.
241
- *
242
- * ### Example:
243
- *
244
- * You have component library on npm called `component-library`, from which
245
- * you export a component called `MyComponent`. For Svelte+TypeScript users,
246
- * you want to provide typings. Therefore you create a `index.d.ts`:
247
- * ```ts
248
- * import { SvelteComponentTyped } from "svelte";
249
- * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}
250
- * ```
251
- * Typing this makes it possible for IDEs like VS Code with the Svelte extension
252
- * to provide intellisense and to use the component like this in a Svelte file
253
- * with TypeScript:
254
- * ```svelte
255
- * <script lang="ts">
256
- * import { MyComponent } from "component-library";
257
- * </script>
258
- * <MyComponent foo={'bar'} />
259
- * ```
260
- *
261
- * #### Why not make this part of `SvelteComponent(Dev)`?
262
- * Because
263
- * ```ts
264
- * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}
265
- * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;
266
- * ```
267
- * will throw a type error, so we need to separate the more strictly typed class.
260
+ * @deprecated Use `SvelteComponent` instead. See PR for more information: https://github.com/sveltejs/svelte/pull/8512
268
261
*/
269
262
export class SvelteComponentTyped <
270
263
Props extends Record < string , any > = any ,
271
264
Events extends Record < string , any > = any ,
272
265
Slots extends Record < string , any > = any
273
- > extends SvelteComponentDev {
274
- /**
275
- * @private
276
- * For type checking capabilities only.
277
- * Does not exist at runtime.
278
- * ### DO NOT USE!
279
- */
280
- $$prop_def : Props ;
281
- /**
282
- * @private
283
- * For type checking capabilities only.
284
- * Does not exist at runtime.
285
- * ### DO NOT USE!
286
- */
287
- $$events_def : Events ;
288
- /**
289
- * @private
290
- * For type checking capabilities only.
291
- * Does not exist at runtime.
292
- * ### DO NOT USE!
293
- */
294
- $$slot_def : Slots ;
295
-
296
- constructor ( options : ComponentConstructorOptions < Props > ) {
297
- super ( options ) ;
298
- }
299
- }
266
+ > extends SvelteComponentDev < Props , Events , Slots > { }
300
267
301
268
/**
302
269
* Convenience type to get the type of a Svelte component. Useful for example in combination with
@@ -305,21 +272,21 @@ export class SvelteComponentTyped<
305
272
* Example:
306
273
* ```html
307
274
* <script lang="ts">
308
- * import type { ComponentType, SvelteComponentTyped } from 'svelte';
275
+ * import type { ComponentType, SvelteComponent } from 'svelte';
309
276
* import Component1 from './Component1.svelte';
310
277
* import Component2 from './Component2.svelte';
311
278
*
312
279
* const component: ComponentType = someLogic() ? Component1 : Component2;
313
- * const componentOfCertainSubType: ComponentType<SvelteComponentTyped <{ needsThisProp: string }>> = someLogic() ? Component1 : Component2;
280
+ * const componentOfCertainSubType: ComponentType<SvelteComponent <{ needsThisProp: string }>> = someLogic() ? Component1 : Component2;
314
281
* </script>
315
282
*
316
283
* <svelte:component this={component} />
317
284
* <svelte:component this={componentOfCertainSubType} needsThisProp="hello" />
318
285
* ```
319
286
*/
320
- export type ComponentType < Component extends SvelteComponentTyped = SvelteComponentTyped > = new (
287
+ export type ComponentType < Component extends SvelteComponentDev = SvelteComponentDev > = new (
321
288
options : ComponentConstructorOptions <
322
- Component extends SvelteComponentTyped < infer Props > ? Props : Record < string , any >
289
+ Component extends SvelteComponentDev < infer Props > ? Props : Record < string , any >
323
290
>
324
291
) => Component ;
325
292
@@ -334,7 +301,7 @@ export type ComponentType<Component extends SvelteComponentTyped = SvelteCompone
334
301
* </script>
335
302
* ```
336
303
*/
337
- export type ComponentProps < Component extends SvelteComponent > = Component extends SvelteComponentTyped < infer Props >
304
+ export type ComponentProps < Component extends SvelteComponent > = Component extends SvelteComponentDev < infer Props >
338
305
? Props
339
306
: never ;
340
307
@@ -354,7 +321,7 @@ export type ComponentProps<Component extends SvelteComponent> = Component extend
354
321
* ```
355
322
*/
356
323
export type ComponentEvents < Component extends SvelteComponent > =
357
- Component extends SvelteComponentTyped < any , infer Events > ? Events : never ;
324
+ Component extends SvelteComponentDev < any , infer Events > ? Events : never ;
358
325
359
326
export function loop_guard ( timeout ) {
360
327
const start = Date . now ( ) ;
0 commit comments