Skip to content

Commit 5cef52a

Browse files
committedApr 22, 2024··
fix(compiler-sfc): handle readonly operator and ReadonlyArray/Map/Set types
close #10726
1 parent 65109a7 commit 5cef52a

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed
 

‎packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts

+31
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,27 @@ describe('resolveType', () => {
265265
})
266266
})
267267

268+
test('utility type: ReadonlyArray', () => {
269+
expect(
270+
resolve(`
271+
defineProps<{ foo: ReadonlyArray<string> }>()
272+
`).props,
273+
).toStrictEqual({
274+
foo: ['Array'],
275+
})
276+
})
277+
278+
test('utility type: ReadonlyMap & Readonly Set', () => {
279+
expect(
280+
resolve(`
281+
defineProps<{ foo: ReadonlyMap<string, unknown>, bar: ReadonlySet<string> }>()
282+
`).props,
283+
).toStrictEqual({
284+
foo: ['Map'],
285+
bar: ['Set'],
286+
})
287+
})
288+
268289
test('indexed access type (literal)', () => {
269290
expect(
270291
resolve(`
@@ -416,6 +437,16 @@ describe('resolveType', () => {
416437
})
417438
})
418439

440+
test('readonly', () => {
441+
expect(
442+
resolve(`
443+
defineProps<{ foo: readonly unknown[] }>()
444+
`).props,
445+
).toStrictEqual({
446+
foo: ['Array'],
447+
})
448+
})
449+
419450
test('ExtractPropTypes (element-plus)', () => {
420451
const { props, raw } = resolve(
421452
`

‎packages/compiler-sfc/src/script/resolveType.ts

+11
Original file line numberDiff line numberDiff line change
@@ -1547,8 +1547,14 @@ export function inferRuntimeType(
15471547

15481548
case 'Parameters':
15491549
case 'ConstructorParameters':
1550+
case 'ReadonlyArray':
15501551
return ['Array']
15511552

1553+
case 'ReadonlyMap':
1554+
return ['Map']
1555+
case 'ReadonlySet':
1556+
return ['Set']
1557+
15521558
case 'NonNullable':
15531559
if (node.typeParameters && node.typeParameters.params[0]) {
15541560
return inferRuntimeType(
@@ -1633,6 +1639,11 @@ export function inferRuntimeType(
16331639
}
16341640
break
16351641
}
1642+
1643+
// e.g. readonly
1644+
case 'TSTypeOperator': {
1645+
return inferRuntimeType(ctx, node.typeAnnotation, scope)
1646+
}
16361647
}
16371648
} catch (e) {
16381649
// always soft fail on failed runtime type inference

0 commit comments

Comments
 (0)
Please sign in to comment.