From 1d1d72894995fde14bd09e2990462c19d5176bf9 Mon Sep 17 00:00:00 2001 From: edison Date: Thu, 20 Apr 2023 21:10:38 +0800 Subject: [PATCH] feat(compiler-sfc): improve utility type Partial and Required (#8103) --- .../compileScript/resolveType.spec.ts | 32 +++++++++++++++++++ .../compiler-sfc/src/script/resolveType.ts | 16 ++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index dc859f3338..c7e2b9b694 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -207,6 +207,38 @@ describe('resolveType', () => { }) }) + test('utility type: Partial', () => { + expect( + resolve(` + type T = { foo: number, bar: string } + defineProps>() + `).raw.props + ).toMatchObject({ + foo: { + optional: true + }, + bar: { + optional: true + } + }) + }) + + test('utility type: Required', () => { + expect( + resolve(` + type T = { foo?: number, bar?: string } + defineProps>() + `).raw.props + ).toMatchObject({ + foo: { + optional: false + }, + bar: { + optional: false + } + }) + }) + test('utility type: Pick', () => { expect( resolve(` diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 79ee256703..526569843e 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -513,8 +513,20 @@ 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], 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], optional: false } + }) + return res + } case 'Readonly': return t case 'Pick': { -- 2.47.3