]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-sfc): support resolve extends interface for defineEmits (#8470)
authoredison <daiwei521@126.com>
Fri, 10 Nov 2023 08:00:04 +0000 (16:00 +0800)
committerGitHub <noreply@github.com>
Fri, 10 Nov 2023 08:00:04 +0000 (16:00 +0800)
close #8465

packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineEmits.spec.ts.snap
packages/compiler-sfc/__tests__/compileScript/defineEmits.spec.ts
packages/compiler-sfc/src/script/resolveType.ts

index 1e851cbf4df88d39dc5dcb47952dd20955572bec..78a9834d2881f32037f4f862786ac9d8ecb0fc61 100644 (file)
@@ -81,6 +81,24 @@ return { emit }
 })"
 `;
 
+exports[`defineEmits > w/ type (interface w/ extends) 1`] = `
+"import { defineComponent as _defineComponent } from 'vue'
+interface Base { (e: 'foo'): void }
+    interface Emits extends Base { (e: 'bar'): void }
+    
+export default /*#__PURE__*/_defineComponent({
+  emits: [\\"bar\\", \\"foo\\"],
+  setup(__props, { expose: __expose, emit: __emit }) {
+  __expose();
+
+    const emit = __emit
+    
+return { emit }
+}
+
+})"
+`;
+
 exports[`defineEmits > w/ type (interface) 1`] = `
 "import { defineComponent as _defineComponent } from 'vue'
 interface Emits { (e: 'foo' | 'bar'): void }
index 13b981db3d7d493dda969a024dd748dd5b23aece..0d1a41e0f2b28dab48c61906df2f6973b345e3fc 100644 (file)
@@ -80,6 +80,18 @@ const emit = defineEmits(['a', 'b'])
     expect(content).toMatch(`emits: ["foo", "bar"]`)
   })
 
+  test('w/ type (interface w/ extends)', () => {
+    const { content } = compile(`
+    <script setup lang="ts">
+    interface Base { (e: 'foo'): void }
+    interface Emits extends Base { (e: 'bar'): void }
+    const emit = defineEmits<Emits>()
+    </script>
+    `)
+    assertCode(content)
+    expect(content).toMatch(`emits: ["bar", "foo"]`)
+  })
+
   test('w/ type (exported interface)', () => {
     const { content } = compile(`
     <script setup lang="ts">
index 229bb3acfae3635b539b671b90b0464becafc9fb..7f2e96cd8159d7784e4a9350ce2220e666b49e41 100644 (file)
@@ -334,12 +334,15 @@ function resolveInterfaceMembers(
         continue
       }
       try {
-        const { props } = resolveTypeElements(ctx, ext, scope)
+        const { props, calls } = resolveTypeElements(ctx, ext, scope)
         for (const key in props) {
           if (!hasOwn(base.props, key)) {
             base.props[key] = props[key]
           }
         }
+        if (calls) {
+          ;(base.calls || (base.calls = [])).push(...calls)
+        }
       } catch (e) {
         ctx.error(
           `Failed to resolve extends base type.\nIf this previously worked in 3.2, ` +