Forráskód Böngészése

fix(compiler-sfc): Optimize the value of emitIdentifier (#12851)

webfansplz 2 éve
szülő
commit
bb59751dd4

+ 4 - 1
packages/compiler-sfc/src/compileScript.ts

@@ -414,7 +414,10 @@ export function compileScript(
     }
 
     if (declId) {
-      emitIdentifier = scriptSetup!.content.slice(declId.start!, declId.end!)
+      emitIdentifier =
+        declId.type === 'Identifier'
+          ? declId.name
+          : scriptSetup!.content.slice(declId.start!, declId.end!)
     }
 
     return true

+ 16 - 0
packages/compiler-sfc/test/__snapshots__/compileScript.spec.ts.snap

@@ -558,6 +558,22 @@ export default /*#__PURE__*/_defineComponent({
 
       
       
+return { emit }
+}
+
+})"
+`;
+
+exports[`SFC compile <script setup> > with TypeScript > defineEmits w/ type (interface ts type) 1`] = `
+"import { defineComponent as _defineComponent } from 'vue'
+interface Emits { (e: 'foo'): void }
+      
+export default /*#__PURE__*/_defineComponent({
+  emits: ['foo'],
+  setup(__props, { emit }) {
+
+      
+      
 return { emit }
 }
 

+ 13 - 0
packages/compiler-sfc/test/compileScript.spec.ts

@@ -1081,6 +1081,19 @@ const emit = defineEmits(['a', 'b'])
       expect(content).toMatch(`emits: ["foo", "bar"]`)
     })
 
+    // https://github.com/vuejs/core/issues/5393
+    test('defineEmits w/ type (interface ts type)', () => {
+      const { content } = compile(`
+      <script setup lang="ts">
+      interface Emits { (e: 'foo'): void }
+      const emit: Emits = defineEmits(['foo'])
+      </script>
+      `)
+      assertCode(content)
+      expect(content).toMatch(`setup(__props, { emit }) {`)
+      expect(content).toMatch(`emits: ['foo']`)
+    })
+
     test('runtime Enum', () => {
       const { content, bindings } = compile(
         `<script setup lang="ts">