diff --git a/packages/playwright-core/types/structs.d.ts b/packages/playwright-core/types/structs.d.ts index eadbb2de01..9c621cff35 100644 --- a/packages/playwright-core/types/structs.d.ts +++ b/packages/playwright-core/types/structs.d.ts @@ -40,6 +40,6 @@ export type Unboxed = export type PageFunction0 = string | (() => R | Promise); export type PageFunction = string | ((arg: Unboxed) => R | Promise); export type PageFunctionOn = string | ((on: On, arg2: Unboxed) => R | Promise); -export type SmartHandle = T extends Node ? ElementHandle : JSHandle; +export type SmartHandle = [T] extends [Node] ? ElementHandle : JSHandle; export type ElementHandleForTag = ElementHandle; export type BindingSource = { context: BrowserContext, page: Page, frame: Frame }; diff --git a/utils/generate_types/test/test.ts b/utils/generate_types/test/test.ts index 05ede91adf..e13c2ac43c 100644 --- a/utils/generate_types/test/test.ts +++ b/utils/generate_types/test/test.ts @@ -323,6 +323,20 @@ playwright.chromium.launch().then(async browser => { console.log(await resultHandle.jsonValue()); await resultHandle.dispose(); + // evaluteHandle with two different return types (JSHandle) + { + const handle = await page.evaluateHandle(() => '' as string | number); + const result = await handle.evaluate(value => value); + const assertion: AssertType = true; + } + // evaluteHandle with two different return types (ElementHandle) + { + const handle = await page.evaluateHandle(() => '' as any as HTMLInputElement | HTMLTextAreaElement); + await handle.evaluate(element => element.value); + const assertion: AssertType, typeof handle> = true; + } + + await browser.close(); })(); @@ -606,7 +620,7 @@ playwright.chromium.launch().then(async browser => { { const handle = await page.waitForSelector('*'); const value = await handle.evaluateHandle((e: HTMLInputElement, x) => e.disabled || x, 123); - const assertion: AssertType | playwright.JSHandle, typeof value> = true; + const assertion: AssertType, typeof value> = true; } {