Sfoglia il codice sorgente

fix(runtime-core): correct type inference for PascalCase emits (#11579)

fix vuejs/language-tools#4269
山吹色御守 1 anno fa
parent
commit
d7d0371e74

+ 15 - 0
packages-private/dts-test/defineComponent.test-d.tsx

@@ -906,12 +906,15 @@ describe('emits', () => {
     emits: {
       click: (n: number) => typeof n === 'number',
       input: (b: string) => b.length > 1,
+      Focus: (f: boolean) => !!f,
     },
     setup(props, { emit }) {
       expectType<((n: number) => boolean) | undefined>(props.onClick)
       expectType<((b: string) => boolean) | undefined>(props.onInput)
+      expectType<((f: boolean) => boolean) | undefined>(props.onFocus)
       emit('click', 1)
       emit('input', 'foo')
+      emit('Focus', true)
       //  @ts-expect-error
       emit('nope')
       //  @ts-expect-error
@@ -922,6 +925,10 @@ describe('emits', () => {
       emit('input')
       //  @ts-expect-error
       emit('input', 1)
+      //  @ts-expect-error
+      emit('focus')
+      //  @ts-expect-error
+      emit('focus', true)
     },
     created() {
       this.$emit('click', 1)
@@ -936,6 +943,10 @@ describe('emits', () => {
       this.$emit('input')
       //  @ts-expect-error
       this.$emit('input', 1)
+      //  @ts-expect-error
+      this.$emit('focus')
+      //  @ts-expect-error
+      this.$emit('focus', true)
     },
     mounted() {
       // #3599
@@ -954,6 +965,10 @@ describe('emits', () => {
         this.$emit('input')
         //  @ts-expect-error
         this.$emit('input', 1)
+        //  @ts-expect-error
+        this.$emit('focus')
+        //  @ts-expect-error
+        this.$emit('focus', true)
       })
     },
   })

+ 7 - 9
packages/runtime-core/src/componentEmits.ts

@@ -47,15 +47,13 @@ export type EmitsToProps<T extends EmitsOptions | ComponentTypeEmits> =
       }
     : T extends ObjectEmitsOptions
       ? {
-          [K in `on${Capitalize<string & keyof T>}`]?: K extends `on${infer C}`
-            ? (
-                ...args: T[Uncapitalize<C>] extends (...args: infer P) => any
-                  ? P
-                  : T[Uncapitalize<C>] extends null
-                    ? any[]
-                    : never
-              ) => any
-            : never
+          [K in string & keyof T as `on${Capitalize<K>}`]?: (
+            ...args: T[K] extends (...args: infer P) => any
+              ? P
+              : T[K] extends null
+                ? any[]
+                : never
+          ) => any
         }
       : {}