From: edison Date: Thu, 20 Apr 2023 13:10:38 +0000 (+0800) Subject: feat(compiler-sfc): improve utility type Partial and Required (#8103) X-Git-Tag: v3.3.0-beta.1~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1d1d72894995fde14bd09e2990462c19d5176bf9;p=thirdparty%2Fvuejs%2Fcore.git feat(compiler-sfc): improve utility type Partial and Required (#8103) --- 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': {