]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): ensure prop type validation warning shows custom class names ...
author白雾三语 <32354856+baiwusanyu-c@users.noreply.github.com>
Fri, 25 Nov 2022 19:52:39 +0000 (03:52 +0800)
committerGitHub <noreply@github.com>
Fri, 25 Nov 2022 19:52:39 +0000 (20:52 +0100)
* fix(runtime-core):

* fix(runtime-core): update

* fix(runtime-core): update reg

* test(runtime-core): add test case for warnings about prop type mismatches

Co-authored-by: Thorsten Luenborg <t.luenborg@googlemail.com>
packages/runtime-core/__tests__/componentProps.spec.ts
packages/runtime-core/src/componentProps.ts

index cdb77838e316a2d949d0b7bc40aca487a6ff5c3e..195f352154c9145b345bb23a959de3dfaaf42d9d 100644 (file)
@@ -321,6 +321,42 @@ describe('component props', () => {
     expect(`Missing required prop: "num"`).toHaveBeenWarned()
   })
 
+  test('warn on type mismatch', () => {
+    class MyClass {
+
+    }
+    const Comp = {
+      props: {
+        bool: { type: Boolean },
+        str: { type: String },
+        num: { type: Number },
+        arr: { type: Array },
+        obj: { type: Object },
+        cls: { type: MyClass },
+        fn: { type: Function },
+      },
+      setup() {
+        return () => null
+      }
+    }
+    render(h(Comp, {
+        bool: 'true',
+        str: 100,
+        num: '100',
+        arr: {},
+        obj: 'false',
+        cls: {},
+        fn: true,
+    }), nodeOps.createElement('div'))
+    expect(`Invalid prop: type check failed for prop "bool". Expected Boolean, got String`).toHaveBeenWarned()
+    expect(`Invalid prop: type check failed for prop "str". Expected String with value "100", got Number with value 100.`).toHaveBeenWarned()
+    expect(`Invalid prop: type check failed for prop "num". Expected Number with value 100, got String with value "100".`).toHaveBeenWarned()
+    expect(`Invalid prop: type check failed for prop "arr". Expected Array, got Object`).toHaveBeenWarned()
+    expect(`Invalid prop: type check failed for prop "obj". Expected Object, got String with value "false"`).toHaveBeenWarned()
+    expect(`Invalid prop: type check failed for prop "fn". Expected Function, got Boolean with value true.`).toHaveBeenWarned()
+    expect(`Invalid prop: type check failed for prop "cls". Expected MyClass, got Object`).toHaveBeenWarned()
+  })
+
   // #3495
   test('should not warn required props using kebab-case', async () => {
     const Comp = {
index d59a4e94699b177169775bea0fdf0f6b83b3e042..fa756fa32f29b65346e9c4ef717d0190a27e0e7c 100644 (file)
@@ -557,8 +557,8 @@ function validatePropName(key: string) {
 // use function string name to check type constructors
 // so that it works across vms / iframes.
 function getType(ctor: Prop<any>): string {
-  const match = ctor && ctor.toString().match(/^\s*function (\w+)/)
-  return match ? match[1] : ctor === null ? 'null' : ''
+  const match = ctor && ctor.toString().match(/^\s*(function|class) (\w+)/)
+  return match ? match[2] : ctor === null ? 'null' : ''
 }
 
 function isSameType(a: Prop<any>, b: Prop<any>): boolean {