})
})
+ 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(`
})
})
+ test('readonly', () => {
+ expect(
+ resolve(`
+ defineProps<{ foo: readonly unknown[] }>()
+ `).props,
+ ).toStrictEqual({
+ foo: ['Array'],
+ })
+ })
+
test('ExtractPropTypes (element-plus)', () => {
const { props, raw } = resolve(
`
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(
}
break
}
+
+ // e.g. readonly
+ case 'TSTypeOperator': {
+ return inferRuntimeType(ctx, node.typeAnnotation, scope)
+ }
}
} catch (e) {
// always soft fail on failed runtime type inference