From 6391daf6586e49e165b3195863b602c3cbb92ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Tue, 28 Mar 2023 15:19:14 +0800 Subject: [PATCH] fix(compiler-sfc): infer TS Extract&Exclude runtime type (#7339) closes #7337 closes #6252 --- .../__snapshots__/compileScript.spec.ts.snap | 2 ++ .../__tests__/compileScript.spec.ts | 8 ++++++++ packages/compiler-sfc/src/compileScript.ts | 19 +++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 473ebd4e0b9..879790e16fa 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -1619,6 +1619,8 @@ export default /*#__PURE__*/_defineComponent({ alias: { type: Array, required: true }, method: { type: Function, required: true }, symbol: { type: Symbol, required: true }, + extract: { type: Number, required: true }, + exclude: { type: [Number, Boolean], 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__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 7616c58f27b..5fb90b475e6 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -960,6 +960,8 @@ const emit = defineEmits(['a', 'b']) alias: Alias method(): void symbol: symbol + extract: Extract<1 | 2 | boolean, 2> + exclude: Exclude<1 | 2 | boolean, 2> objectOrFn: { (): void foo: string @@ -997,6 +999,10 @@ const emit = defineEmits(['a', 'b']) expect(content).toMatch( `objectOrFn: { type: [Function, Object], required: true },` ) + expect(content).toMatch(`extract: { type: Number, required: true }`) + expect(content).toMatch( + `exclude: { type: [Number, Boolean], required: true }` + ) expect(content).toMatch( `union: { type: [String, Number], required: true }` ) @@ -1031,6 +1037,8 @@ const emit = defineEmits(['a', 'b']) method: BindingTypes.PROPS, symbol: BindingTypes.PROPS, objectOrFn: BindingTypes.PROPS, + extract: BindingTypes.PROPS, + exclude: BindingTypes.PROPS, union: BindingTypes.PROPS, literalUnion: BindingTypes.PROPS, literalUnionNumber: BindingTypes.PROPS, diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 3cca3c2f436..278a433db38 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -2057,11 +2057,26 @@ function inferRuntimeType( case 'Readonly': case 'Pick': case 'Omit': - case 'Exclude': - case 'Extract': case 'Required': case 'InstanceType': return ['Object'] + + case 'Extract': + if (node.typeParameters && node.typeParameters.params[1]) { + return inferRuntimeType( + node.typeParameters.params[1], + declaredTypes + ) + } + return ['null'] + case 'Exclude': + if (node.typeParameters && node.typeParameters.params[0]) { + return inferRuntimeType( + node.typeParameters.params[0], + declaredTypes + ) + } + return ['null'] } } return [`null`]