diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 9018df65a18..2b10b20a2d6 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -1637,6 +1637,9 @@ export default /*#__PURE__*/_defineComponent({ symbol: { type: Symbol, required: true }, extract: { type: Number, required: true }, exclude: { type: [Number, Boolean], required: true }, + uppercase: { type: String, required: true }, + params: { type: Array, required: true }, + nonNull: { type: String, required: true }, objectOrFn: { type: [Function, Object], required: true }, union: { type: [String, Number], required: true }, literalUnion: { type: String, required: true }, diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScriptHoistStatic.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScriptHoistStatic.spec.ts.snap index 5b7aa43888c..ed5301432e8 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScriptHoistStatic.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScriptHoistStatic.spec.ts.snap @@ -1,4 +1,4 @@ -// Vitest Snapshot v1 +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`sfc hoist static > should enable when only script setup 1`] = ` "const foo = 'bar' diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 10eeea01674..6b5ea437519 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -962,6 +962,9 @@ const emit = defineEmits(['a', 'b']) symbol: symbol extract: Extract<1 | 2 | boolean, 2> exclude: Exclude<1 | 2 | boolean, 2> + uppercase: Uppercase<'foo'> + params: Parameters<(foo: any) => void> + nonNull: NonNullable objectOrFn: { (): void foo: string @@ -1004,6 +1007,9 @@ const emit = defineEmits(['a', 'b']) expect(content).toMatch( `exclude: { type: [Number, Boolean], 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 }`) expect(content).toMatch( `union: { type: [String, Number], required: true }` ) @@ -1047,7 +1053,10 @@ const emit = defineEmits(['a', 'b']) literalUnionMixed: BindingTypes.PROPS, intersection: BindingTypes.PROPS, intersection2: BindingTypes.PROPS, - foo: BindingTypes.PROPS + foo: BindingTypes.PROPS, + uppercase: BindingTypes.PROPS, + params: BindingTypes.PROPS, + nonNull: BindingTypes.PROPS }) }) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 922351d9d45..ebaf1eee472 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -2056,15 +2056,35 @@ function inferRuntimeType( case 'Date': case 'Promise': return [node.typeName.name] - case 'Record': + + // TS built-in utility types + // https://www.typescriptlang.org/docs/handbook/utility-types.html case 'Partial': + case 'Required': case 'Readonly': + case 'Record': case 'Pick': case 'Omit': - case 'Required': case 'InstanceType': return ['Object'] + case 'Uppercase': + case 'Lowercase': + case 'Capitalize': + case 'Uncapitalize': + return ['String'] + + case 'Parameters': + case 'ConstructorParameters': + return ['Array'] + + case 'NonNullable': + if (node.typeParameters && node.typeParameters.params[0]) { + return inferRuntimeType( + node.typeParameters.params[0], + declaredTypes + ).filter(t => t !== 'null') + } case 'Extract': if (node.typeParameters && node.typeParameters.params[1]) { return inferRuntimeType( @@ -2072,15 +2092,15 @@ function inferRuntimeType( declaredTypes ) } - return ['null'] case 'Exclude': + case 'OmitThisParameter': if (node.typeParameters && node.typeParameters.params[0]) { return inferRuntimeType( node.typeParameters.params[0], declaredTypes ) } - return ['null'] + // cannot infer, fallback to null: ThisParameterType } } return [`null`]