Skip to content

Commit 9d4111a

Browse files
committed
more accurate types
1 parent d5f673a commit 9d4111a

File tree

5 files changed

+62
-9
lines changed

5 files changed

+62
-9
lines changed

packages/svelte/scripts/generate-types.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ await createBundle({
3030
[`${pkg.name}/legacy`]: `${dir}/src/legacy/legacy-client.js`,
3131
[`${pkg.name}/motion`]: `${dir}/src/motion/public.d.ts`,
3232
[`${pkg.name}/reactivity`]: `${dir}/src/reactivity/index-client.js`,
33-
[`${pkg.name}/server`]: `${dir}/src/server/index.js`,
33+
[`${pkg.name}/server`]: `${dir}/src/server/index.d.ts`,
3434
[`${pkg.name}/store`]: `${dir}/src/store/public.d.ts`,
3535
[`${pkg.name}/transition`]: `${dir}/src/transition/public.d.ts`,
3636
[`${pkg.name}/events`]: `${dir}/src/events/index.js`,

packages/svelte/src/server/index.d.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import type { RenderOutput } from '#server';
2+
import type { ComponentProps, Component, SvelteComponent, ComponentType } from 'svelte';
3+
4+
/**
5+
* Only available on the server and when compiling with the `server` option.
6+
* Takes a component and returns an object with `body` and `head` properties on it, which you can use to populate the HTML when server-rendering your app.
7+
*/
8+
export function render<
9+
Comp extends SvelteComponent<any> | Component<any>,
10+
Props extends ComponentProps<Comp> = ComponentProps<Comp>
11+
>(
12+
...args: {} extends Props
13+
? [
14+
component: Comp extends SvelteComponent<any> ? ComponentType<Comp> : Comp,
15+
options?: { props?: Omit<Props, '$$slots' | '$$events'>; context?: Map<any, any> }
16+
]
17+
: [
18+
component: Comp extends SvelteComponent<any> ? ComponentType<Comp> : Comp,
19+
options: { props: Omit<Props, '$$slots' | '$$events'>; context?: Map<any, any> }
20+
]
21+
): RenderOutput;

packages/svelte/tests/types/component.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@ render(NewComponent, {
156156
x: ''
157157
}
158158
});
159+
// @ts-expect-error
160+
render(NewComponent);
161+
render(NewComponent, {
162+
props: {
163+
// @ts-expect-error
164+
prop: 1
165+
}
166+
});
159167

160168
// --------------------------------------------------------------------------- interop
161169

@@ -276,9 +284,22 @@ hydrate(functionComponent, {
276284
render(functionComponent, {
277285
props: {
278286
binding: true,
279-
readonly: 'foo',
287+
readonly: 'foo'
288+
}
289+
});
290+
// @ts-expect-error
291+
render(functionComponent);
292+
render(functionComponent, {
293+
// @ts-expect-error
294+
props: {
295+
binding: true
296+
}
297+
});
298+
render(functionComponent, {
299+
props: {
300+
binding: true,
280301
// @ts-expect-error
281-
x: ''
302+
readonly: 1
282303
}
283304
});
284305

packages/svelte/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"svelte/internal/client": ["./src/internal/client/index.js"],
2424
"svelte/legacy": ["./src/legacy/legacy-client.js"],
2525
"svelte/motion": ["./src/motion/public.d.ts"],
26-
"svelte/server": ["./src/server/index.js"],
26+
"svelte/server": ["./src/server/index.d.ts"],
2727
"svelte/store": ["./src/store/public.d.ts"],
2828
"#compiler": ["./src/compiler/types/index.d.ts"],
2929
"#client": ["./src/internal/client/types.d.ts"],

packages/svelte/types/index.d.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,14 +2110,25 @@ declare module 'svelte/reactivity' {
21102110
}
21112111

21122112
declare module 'svelte/server' {
2113+
import type { ComponentProps, Component, SvelteComponent, ComponentType } from 'svelte';
21132114
/**
21142115
* Only available on the server and when compiling with the `server` option.
21152116
* Takes a component and returns an object with `body` and `head` properties on it, which you can use to populate the HTML when server-rendering your app.
2116-
* */
2117-
export function render<Props extends Record<string, any>>(component: import("svelte").Component<Props, any, string> | import("svelte").ComponentType<import("svelte").SvelteComponent<Props, any, any>>, options?: {
2118-
props?: Omit<Props, "$$slots" | "$$events"> | undefined;
2119-
context?: Map<any, any> | undefined;
2120-
} | undefined): RenderOutput;
2117+
*/
2118+
export function render<
2119+
Comp extends SvelteComponent<any> | Component<any>,
2120+
Props extends ComponentProps<Comp> = ComponentProps<Comp>
2121+
>(
2122+
...args: {} extends Props
2123+
? [
2124+
component: Comp extends SvelteComponent<any> ? ComponentType<Comp> : Comp,
2125+
options?: { props?: Omit<Props, '$$slots' | '$$events'>; context?: Map<any, any> }
2126+
]
2127+
: [
2128+
component: Comp extends SvelteComponent<any> ? ComponentType<Comp> : Comp,
2129+
options: { props: Omit<Props, '$$slots' | '$$events'>; context?: Map<any, any> }
2130+
]
2131+
): RenderOutput;
21212132
interface RenderOutput {
21222133
/** HTML that goes into the `<head>` */
21232134
head: string;

0 commit comments

Comments
 (0)