Skip to content

Commit 96ed8da

Browse files
authored
fix: Match runtime type of baseElement in TypeScript types (#1023)
1 parent b0f9d97 commit 96ed8da

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

types/index.d.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ export * from '@testing-library/dom'
1414
export type RenderResult<
1515
Q extends Queries = typeof queries,
1616
Container extends Element | DocumentFragment = HTMLElement,
17+
BaseElement extends Element | DocumentFragment = Container,
1718
> = {
1819
container: Container
19-
baseElement: Element
20+
baseElement: BaseElement
2021
debug: (
2122
baseElement?:
2223
| Element
@@ -33,6 +34,7 @@ export type RenderResult<
3334
export interface RenderOptions<
3435
Q extends Queries = typeof queries,
3536
Container extends Element | DocumentFragment = HTMLElement,
37+
BaseElement extends Element | DocumentFragment = Container,
3638
> {
3739
/**
3840
* By default, React Testing Library will create a div and append that div to the document.body. Your React component will be rendered in the created div. If you provide your own HTMLElement container via this option,
@@ -50,7 +52,7 @@ export interface RenderOptions<
5052
*
5153
* @see https://testing-library.com/docs/react-testing-library/api/#baseelement
5254
*/
53-
baseElement?: Element
55+
baseElement?: BaseElement
5456
/**
5557
* If `hydrate` is set to `true`, then it will render with `ReactDOM.hydrate`. This may be useful if you are using server-side
5658
* rendering and use ReactDOM.hydrate to mount your components.
@@ -81,10 +83,11 @@ type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
8183
export function render<
8284
Q extends Queries = typeof queries,
8385
Container extends Element | DocumentFragment = HTMLElement,
86+
BaseElement extends Element | DocumentFragment = Container,
8487
>(
8588
ui: React.ReactElement,
86-
options: RenderOptions<Q, Container>,
87-
): RenderResult<Q, Container>
89+
options: RenderOptions<Q, Container, BaseElement>,
90+
): RenderResult<Q, Container, BaseElement>
8891
export function render(
8992
ui: React.ReactElement,
9093
options?: Omit<RenderOptions, 'queries'>,

types/test.tsx

+19
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,25 @@ export function wrappedRenderC(
141141
return pure.render(ui, {wrapper: AppWrapperProps, ...options})
142142
}
143143

144+
export function testBaseElement() {
145+
const {baseElement: baseDefaultElement} = render(<div />)
146+
expectType<HTMLElement, typeof baseDefaultElement>(baseDefaultElement)
147+
148+
const container = document.createElement('input')
149+
const {baseElement: baseElementFromContainer} = render(<div />, {container})
150+
expectType<typeof container, typeof baseElementFromContainer>(
151+
baseElementFromContainer,
152+
)
153+
154+
const baseElementOption = document.createElement('input')
155+
const {baseElement: baseElementFromOption} = render(<div />, {
156+
baseElement: baseElementOption,
157+
})
158+
expectType<typeof baseElementOption, typeof baseElementFromOption>(
159+
baseElementFromOption,
160+
)
161+
}
162+
144163
/*
145164
eslint
146165
testing-library/prefer-explicit-assert: "off",

0 commit comments

Comments
 (0)