Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion generate-type-definitions.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ function modify(path, modifyFn) {

modify(
'types/runtime/index.d.ts',
content => content.replace('SvelteComponentTyped', 'SvelteComponentTyped, ComponentType, ComponentConstructorOptions, ComponentProps')
content => content.replace('SvelteComponentTyped', 'SvelteComponentTyped, ComponentType, ComponentConstructorOptions, ComponentProps, ComponentEvents, ComponentEvent, ComponentSlots')
);
modify(
'types/compiler/index.d.ts',
Expand Down
38 changes: 38 additions & 0 deletions src/runtime/internal/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,44 @@ export type ComponentProps<Component extends SvelteComponent> = Component extend
? Props
: never;

/**
* Convenience type to get the events the given component expects. Example:
* ```html
* <script lang="ts">
* import type { ComponentEvents } from 'svelte';
* import Component from './Component.svelte';
*
* type $$Events = ComponentEvent<Component>;
* </script>
*
* <div class="wrapper">
* <Component on:close />
* </div>
* ```
*/
export type ComponentEvents<Component extends SvelteComponent> = Component extends SvelteComponentTyped<any, infer Events>
? Events
: never;

/**
* Convenience type to get an event the given component expects. Example:
* ```html
* <script lang="ts">
* import type { ComponentEvent } from 'svelte';
* import Component from './Component.svelte';
*
* function handleCloseEvent(event: ComponentEvent<Component, 'close'>) {
* console.log(event.detail);
* };
* </script>
*
* <Component on:close={handleCloseEvent} />
* ```
*/
export type ComponentEvent<Component extends SvelteComponent, Name extends string> = Component extends SvelteComponentTyped<any, infer Events>
? never extends Events[Name] ? CustomEvent<unknown> : Events[Name]
: never;

export function loop_guard(timeout) {
const start = Date.now();
return () => {
Expand Down