]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-sfc): handle readonly operator and ReadonlyArray/Map/Set types
authorEvan You <yyx990803@gmail.com>
Mon, 22 Apr 2024 07:36:38 +0000 (15:36 +0800)
committerEvan You <yyx990803@gmail.com>
Mon, 22 Apr 2024 07:36:38 +0000 (15:36 +0800)
close #10726

packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts
packages/compiler-sfc/src/script/resolveType.ts

index f3be58a301c1262a2846ae0de857ef85f6df6057..dc95a9dc64319624172160b885656729ef295be8 100644 (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(
       `
index f6e291791a849dc169e65921bcf58c8c3d178320..54b207e7e916669a1b383c9e65c8840668d29197 100644 (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