fix(compiler-sfc): handle readonly operator and ReadonlyArray/Map/Set types

close #10726
This commit is contained in:
Evan You 2024-04-22 15:36:38 +08:00
parent 65109a70f1
commit 5cef52a5c2
No known key found for this signature in database
GPG Key ID: B9D421896CA450FB
2 changed files with 42 additions and 0 deletions

View File

@ -265,6 +265,27 @@ describe('resolveType', () => {
})
})
test('utility type: ReadonlyArray', () => {
expect(
resolve(`
defineProps<{ foo: ReadonlyArray<string> }>()
`).props,
).toStrictEqual({
foo: ['Array'],
})
})
test('utility type: ReadonlyMap & Readonly Set', () => {
expect(
resolve(`
defineProps<{ foo: ReadonlyMap<string, unknown>, bar: ReadonlySet<string> }>()
`).props,
).toStrictEqual({
foo: ['Map'],
bar: ['Set'],
})
})
test('indexed access type (literal)', () => {
expect(
resolve(`
@ -416,6 +437,16 @@ describe('resolveType', () => {
})
})
test('readonly', () => {
expect(
resolve(`
defineProps<{ foo: readonly unknown[] }>()
`).props,
).toStrictEqual({
foo: ['Array'],
})
})
test('ExtractPropTypes (element-plus)', () => {
const { props, raw } = resolve(
`

View File

@ -1547,8 +1547,14 @@ export function inferRuntimeType(
case 'Parameters':
case 'ConstructorParameters':
case 'ReadonlyArray':
return ['Array']
case 'ReadonlyMap':
return ['Map']
case 'ReadonlySet':
return ['Set']
case 'NonNullable':
if (node.typeParameters && node.typeParameters.params[0]) {
return inferRuntimeType(
@ -1633,6 +1639,11 @@ export function inferRuntimeType(
}
break
}
// e.g. readonly
case 'TSTypeOperator': {
return inferRuntimeType(ctx, node.typeAnnotation, scope)
}
}
} catch (e) {
// always soft fail on failed runtime type inference