Skip to content

Commit 3ccbea0

Browse files
authored
fix(compiler-sfc): accept StringLiteral node in defineEmit tuple syntax (#8041)
close #8040
1 parent 5531ff4 commit 3ccbea0

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap

+16
Original file line numberDiff line numberDiff line change
@@ -1457,6 +1457,22 @@ export default /*#__PURE__*/_defineComponent({
14571457

14581458

14591459

1460+
return { emit }
1461+
}
1462+
1463+
})"
1464+
`;
1465+
1466+
exports[`SFC compile <script setup> > with TypeScript > defineEmits w/ type (property syntax string literal) 1`] = `
1467+
"import { defineComponent as _defineComponent } from 'vue'
1468+
1469+
export default /*#__PURE__*/_defineComponent({
1470+
emits: [\\"foo:bar\\"],
1471+
setup(__props, { expose: __expose, emit }) {
1472+
__expose();
1473+
1474+
1475+
14601476
return { emit }
14611477
}
14621478

packages/compiler-sfc/__tests__/compileScript.spec.ts

+11
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,17 @@ const emit = defineEmits(['a', 'b'])
16291629
assertCode(content)
16301630
})
16311631

1632+
// #8040
1633+
test('defineEmits w/ type (property syntax string literal)', () => {
1634+
const { content } = compile(`
1635+
<script setup lang="ts">
1636+
const emit = defineEmits<{ 'foo:bar': [] }>()
1637+
</script>
1638+
`)
1639+
expect(content).toMatch(`emits: ["foo:bar"]`)
1640+
assertCode(content)
1641+
})
1642+
16321643
describe('defineSlots()', () => {
16331644
test('basic usage', () => {
16341645
const { content } = compile(`

packages/compiler-sfc/src/compileScript.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -2316,11 +2316,15 @@ function extractRuntimeEmits(
23162316
hasCallSignature = true
23172317
}
23182318
if (t.type === 'TSPropertySignature') {
2319-
if (t.key.type !== 'Identifier' || t.computed) {
2319+
if (t.key.type === 'Identifier' && !t.computed) {
2320+
emits.add(t.key.name)
2321+
hasProperty = true
2322+
} else if (t.key.type === 'StringLiteral' && !t.computed) {
2323+
emits.add(t.key.value)
2324+
hasProperty = true
2325+
} else {
23202326
error(`defineEmits() type cannot use computed keys.`, t.key)
23212327
}
2322-
emits.add(t.key.name)
2323-
hasProperty = true
23242328
}
23252329
}
23262330
if (hasCallSignature && hasProperty) {

0 commit comments

Comments
 (0)