From 7a70eaf71c66267d8cd8c589f937afab1ea99d9e Mon Sep 17 00:00:00 2001 From: edison1105 Date: Mon, 17 Apr 2023 22:03:49 +0800 Subject: [PATCH 1/4] feat(compiler-sfc): improve utility type Partial and Required --- .../compiler-sfc/src/script/resolveType.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 79ee2567035..aebc7286117 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -513,8 +513,22 @@ function resolveBuiltin( ): ResolvedElements { const t = resolveTypeElements(ctx, node.typeParameters!.params[0]) switch (name) { - case 'Partial': - case 'Required': + case 'Partial': { + const res: ResolvedElements = { props: {}, calls: t.calls } + Object.keys(t.props).forEach(key => { + res.props[key] = t.props[key] + res.props[key].optional = true + }) + return res + } + case 'Required': { + const res: ResolvedElements = { props: {}, calls: t.calls } + Object.keys(t.props).forEach(key => { + res.props[key] = t.props[key] + res.props[key].optional = false + }) + return res + } case 'Readonly': return t case 'Pick': { From 8fa38e7f634eeae9b0e2998b86fd3b6bc4c5f600 Mon Sep 17 00:00:00 2001 From: daiwei Date: Thu, 20 Apr 2023 16:26:45 +0800 Subject: [PATCH 2/4] chore: improve code --- packages/compiler-sfc/src/script/resolveType.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index aebc7286117..526569843ec 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -516,16 +516,14 @@ function resolveBuiltin( case 'Partial': { const res: ResolvedElements = { props: {}, calls: t.calls } Object.keys(t.props).forEach(key => { - res.props[key] = t.props[key] - res.props[key].optional = true + res.props[key] = { ...t.props[key], optional: true } }) return res } case 'Required': { const res: ResolvedElements = { props: {}, calls: t.calls } Object.keys(t.props).forEach(key => { - res.props[key] = t.props[key] - res.props[key].optional = false + res.props[key] = { ...t.props[key], optional: false } }) return res } From 6fddcee2ca02757428150b431eba0b91da74ad3f Mon Sep 17 00:00:00 2001 From: daiwei Date: Thu, 20 Apr 2023 19:43:17 +0800 Subject: [PATCH 3/4] test: add test case --- .../__snapshots__/defineProps.spec.ts.snap | 38 +++++++++++++++++++ .../compileScript/defineProps.spec.ts | 28 ++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap index 47328442328..9249e9b9456 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineProps.spec.ts.snap @@ -38,6 +38,44 @@ return { props } })" `; +exports[`defineProps > w/ Partial 1`] = ` +"import { defineComponent as _defineComponent } from 'vue' +interface Props { x: number } + +export default /*#__PURE__*/_defineComponent({ + props: { + x: { type: Number, required: false } + }, + setup(__props: any, { expose: __expose }) { + __expose(); + + + +return { } +} + +})" +`; + +exports[`defineProps > w/ Required 1`] = ` +"import { defineComponent as _defineComponent } from 'vue' +interface Props { x?: number } + +export default /*#__PURE__*/_defineComponent({ + props: { + x: { type: Number, required: true } + }, + setup(__props: any, { expose: __expose }) { + __expose(); + + + +return { } +} + +})" +`; + exports[`defineProps > w/ TS assertion 1`] = ` "import { defineComponent as _defineComponent } from 'vue' diff --git a/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts index cf61c98406c..f2f280ea563 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineProps.spec.ts @@ -233,6 +233,34 @@ const props = defineProps({ foo: String }) }) }) + test('w/ Required', () => { + const { content, bindings } = compile(` + + `) + assertCode(content) + expect(content).toMatch(`x: { type: Number, required: true }`) + expect(bindings).toStrictEqual({ + x: BindingTypes.PROPS + }) + }) + + test('w/ Partial', () => { + const { content, bindings } = compile(` + + `) + assertCode(content) + expect(content).toMatch(`x: { type: Number, required: false }`) + expect(bindings).toStrictEqual({ + x: BindingTypes.PROPS + }) + }) + test('w/ extends interface', () => { const { content, bindings } = compile(` - `) - assertCode(content) - expect(content).toMatch(`x: { type: Number, required: true }`) - expect(bindings).toStrictEqual({ - x: BindingTypes.PROPS - }) - }) - - test('w/ Partial', () => { - const { content, bindings } = compile(` - - `) - assertCode(content) - expect(content).toMatch(`x: { type: Number, required: false }`) - expect(bindings).toStrictEqual({ - x: BindingTypes.PROPS - }) - }) - test('w/ extends interface', () => { const { content, bindings } = compile(`