feat(types): improve event type inference when using `h` with native elements (#9756)

This commit is contained in:
丶远方 2023-12-11 22:10:01 +08:00 committed by GitHub
parent a41409ed02
commit a625376ac8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 1 deletions

View File

@ -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
@ -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', () => {

View File

@ -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,