Skip to content

Commit d46ed8f

Browse files
authored
feat: Add types for props and slots in render function
* Add types for render function * Fix lint errors
1 parent 3ecde9e commit d46ed8f

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@
6868
"lodash.merge": "^4.6.2",
6969
"msw": "^1.3.2",
7070
"tsd": "^0.29.0",
71+
"type-fest": "~2.19",
7172
"typescript": "^5.2.2",
7273
"vee-validate": "^4.11.8",
7374
"vue": "^3.3.5",
75+
"vue-component-type-helpers": "^2.0.19",
7476
"vue-eslint-parser": "^9.3.2",
7577
"vue-i18n": "^9.5.0",
7678
"vue-router": "^4.2.5",

src/__tests__/render.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import {render, cleanup} from '..'
21
import {h, defineComponent} from 'vue'
32
import '@testing-library/jest-dom'
3+
import {render, cleanup} from '..'
44

55
test('baseElement defaults to document.body', () => {
66
const {baseElement} = render({template: '<div />'})

types/index.d.ts

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// Minimum TypeScript Version: 4.0
22
/* eslint-disable @typescript-eslint/no-explicit-any */
33

4+
import {VNodeChild} from 'vue'
45
import {MountingOptions} from '@vue/test-utils'
56
import {queries, EventType, BoundFunctions} from '@testing-library/dom'
67
// eslint-disable-next-line import/no-extraneous-dependencies
78
import {OptionsReceived as PrettyFormatOptions} from 'pretty-format'
9+
import {ComponentProps, ComponentSlots} from 'vue-component-type-helpers'
10+
import {RemoveIndexSignature} from 'type-fest'
811

912
// NOTE: fireEvent is overridden below
1013
export * from '@testing-library/dom'
@@ -44,12 +47,26 @@ interface VueTestingLibraryRenderOptions {
4447
container?: Element
4548
baseElement?: Element
4649
}
47-
export type RenderOptions = VueTestingLibraryRenderOptions &
48-
VueTestUtilsRenderOptions
4950

50-
export function render(
51-
TestComponent: any, // this makes me sad :sob:
52-
options?: RenderOptions,
51+
type AllowNonFunctionSlots<Slots> = {
52+
[K in keyof Slots]: Slots[K] | VNodeChild
53+
}
54+
type ExtractSlots<C> = AllowNonFunctionSlots<
55+
Partial<RemoveIndexSignature<ComponentSlots<C>>>
56+
>
57+
58+
export interface RenderOptions<C>
59+
extends Omit<
60+
VueTestingLibraryRenderOptions & VueTestUtilsRenderOptions,
61+
'props' | 'slots'
62+
> {
63+
props?: ComponentProps<C>
64+
slots?: ExtractSlots<C>
65+
}
66+
67+
export function render<C>(
68+
TestComponent: C,
69+
options?: RenderOptions<C>,
5370
): RenderResult
5471

5572
export type AsyncFireObject = {

types/index.test-d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export async function testWaitFor() {
6868
export function testOptions() {
6969
render(SomeComponent, {
7070
attrs: {a: 1},
71-
props: {c: 1}, // ideally it would fail because `c` is not an existing prop…
71+
props: {foo: 1},
7272
data: () => ({b: 2}),
7373
slots: {
7474
default: '<div />',

0 commit comments

Comments
 (0)