+return { emit }
+}
+
+})"
+`;
+
+exports[`SFC compile <script setup> > with TypeScript > defineEmits w/ type (property syntax string literal) 1`] = `
+"import { defineComponent as _defineComponent } from 'vue'
+
+export default /*#__PURE__*/_defineComponent({
+ emits: [\\"foo:bar\\"],
+ setup(__props, { expose: __expose, emit }) {
+ __expose();
+
+
+
return { emit }
}
assertCode(content)
})
+ // #8040
+ test('defineEmits w/ type (property syntax string literal)', () => {
+ const { content } = compile(`
+ <script setup lang="ts">
+ const emit = defineEmits<{ 'foo:bar': [] }>()
+ </script>
+ `)
+ expect(content).toMatch(`emits: ["foo:bar"]`)
+ assertCode(content)
+ })
+
describe('defineSlots()', () => {
test('basic usage', () => {
const { content } = compile(`
hasCallSignature = true
}
if (t.type === 'TSPropertySignature') {
- if (t.key.type !== 'Identifier' || t.computed) {
+ if (t.key.type === 'Identifier' && !t.computed) {
+ emits.add(t.key.name)
+ hasProperty = true
+ } else if (t.key.type === 'StringLiteral' && !t.computed) {
+ emits.add(t.key.value)
+ hasProperty = true
+ } else {
error(`defineEmits() type cannot use computed keys.`, t.key)
}
- emits.add(t.key.name)
- hasProperty = true
}
}
if (hasCallSignature && hasProperty) {