Skip to content

Commit

Permalink
feat(types): improve event type inference when using h with native …
Browse files Browse the repository at this point in the history
…elements (#9756)
  • Loading branch information
Alfred-Skyblue committed Dec 11, 2023
1 parent a41409e commit a625376
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
13 changes: 12 additions & 1 deletion packages/dts-test/h.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
Component,
resolveComponent
} from 'vue'
import { describe, expectAssignable } from './utils'
import { describe, expectAssignable, expectType } from './utils'

describe('h inference w/ element', () => {
// key
Expand All @@ -32,6 +32,17 @@ describe('h inference w/ element', () => {
// slots
const slots = { default: () => {} } // RawSlots
h('div', {}, slots)
// events
h('div', {
onClick: e => {
expectType<MouseEvent>(e)
}
})
h('input', {
onFocus(e) {
expectType<FocusEvent>(e)
}
})
})

describe('h inference w/ Fragment', () => {
Expand Down
17 changes: 17 additions & 0 deletions packages/runtime-core/src/h.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,27 @@ interface Constructor<P = any> {
new (...args: any[]): { $props: P }
}

type HTMLElementEventHandler = {
[K in keyof HTMLElementEventMap as `on${Capitalize<K>}`]?: (
ev: HTMLElementEventMap[K]
) => any
}

// The following is a series of overloads for providing props validation of
// manually written render functions.

// element
export function h<K extends keyof HTMLElementTagNameMap>(
type: K,
children?: RawChildren
): VNode
export function h<K extends keyof HTMLElementTagNameMap>(
type: K,
props?: (RawProps & HTMLElementEventHandler) | null,
children?: RawChildren | RawSlots
): VNode

// custom element
export function h(type: string, children?: RawChildren): VNode
export function h(
type: string,
Expand Down

0 comments on commit a625376

Please sign in to comment.