diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index b7a13e56851..d0559423e7e 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -1677,6 +1677,8 @@ interface Test {} type Alias = number[] + enum Enum { one = '1', two = '2' } + export default /*#__PURE__*/_defineComponent({ props: { @@ -1702,6 +1704,7 @@ export default /*#__PURE__*/_defineComponent({ symbol: { type: Symbol, required: true }, extract: { type: Number, required: true }, exclude: { type: [Number, Boolean], required: true }, + enum: { type: Object, required: true }, uppercase: { type: String, required: true }, params: { type: Array, required: true }, nonNull: { type: String, required: true }, @@ -1719,7 +1722,7 @@ export default /*#__PURE__*/_defineComponent({ -return { } +return { Enum } } })" diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 8f96ecc11c5..0c53a155a5a 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -998,6 +998,8 @@ const emit = defineEmits(['a', 'b']) type Alias = number[] + enum Enum { one = '1', two = '2' } + defineProps<{ string: string number: number @@ -1021,6 +1023,7 @@ const emit = defineEmits(['a', 'b']) symbol: symbol extract: Extract<1 | 2 | boolean, 2> exclude: Exclude<1 | 2 | boolean, 2> + enum: Enum uppercase: Uppercase<'foo'> params: Parameters<(foo: any) => void> nonNull: NonNullable @@ -1066,6 +1069,7 @@ const emit = defineEmits(['a', 'b']) expect(content).toMatch( `exclude: { type: [Number, Boolean], required: true }` ) + expect(content).toMatch(`enum: { type: Object, required: true }`) expect(content).toMatch(`uppercase: { type: String, required: true }`) expect(content).toMatch(`params: { type: Array, required: true }`) expect(content).toMatch(`nonNull: { type: String, required: true }`) @@ -1115,7 +1119,9 @@ const emit = defineEmits(['a', 'b']) foo: BindingTypes.PROPS, uppercase: BindingTypes.PROPS, params: BindingTypes.PROPS, - nonNull: BindingTypes.PROPS + nonNull: BindingTypes.PROPS, + enum: BindingTypes.PROPS, + Enum: BindingTypes.LITERAL_CONST }) }) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index e2e129924e3..dff71e642f2 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -1369,14 +1369,15 @@ export function compileScript( if (isTS) { // move all Type declarations to outer scope if ( - (node.type.startsWith('TS') || - (node.type === 'ExportNamedDeclaration' && - node.exportKind === 'type') || - (node.type === 'VariableDeclaration' && node.declare)) && - node.type !== 'TSEnumDeclaration' + node.type.startsWith('TS') || + (node.type === 'ExportNamedDeclaration' && + node.exportKind === 'type') || + (node.type === 'VariableDeclaration' && node.declare) ) { recordType(node, declaredTypes) - hoistNode(node) + if (node.type !== 'TSEnumDeclaration') { + hoistNode(node) + } } } } @@ -1957,7 +1958,10 @@ interface PropTypeData { } function recordType(node: Node, declaredTypes: Record) { - if (node.type === 'TSInterfaceDeclaration') { + if ( + node.type === 'TSInterfaceDeclaration' || + node.type === 'TSEnumDeclaration' + ) { declaredTypes[node.id.name] = [`Object`] } else if (node.type === 'TSTypeAliasDeclaration') { declaredTypes[node.id.name] = inferRuntimeType(