Browse Source

fix(props): correctly warn when a provided prop is Symbol (#10529)

* fix(props): correctly warn when a provided prop is Symbol

Fixes #10519

* style: space before parens
Eduardo San Martin Morote 5 years ago
parent
commit
abb5ef35dd
2 changed files with 20 additions and 9 deletions
  1. 10 9
      src/core/util/props.js
  2. 10 0
      test/unit/features/options/props.spec.js

+ 10 - 9
src/core/util/props.js

@@ -205,18 +205,19 @@ function getInvalidTypeMessage (name, value, expectedTypes) {
     ` Expected ${expectedTypes.map(capitalize).join(', ')}`
     ` Expected ${expectedTypes.map(capitalize).join(', ')}`
   const expectedType = expectedTypes[0]
   const expectedType = expectedTypes[0]
   const receivedType = toRawType(value)
   const receivedType = toRawType(value)
-  const expectedValue = styleValue(value, expectedType)
-  const receivedValue = styleValue(value, receivedType)
   // check if we need to specify expected value
   // check if we need to specify expected value
-  if (expectedTypes.length === 1 &&
-      isExplicable(expectedType) &&
-      !isBoolean(expectedType, receivedType)) {
-    message += ` with value ${expectedValue}`
+  if (
+    expectedTypes.length === 1 &&
+    isExplicable(expectedType) &&
+    isExplicable(typeof value) &&
+    !isBoolean(expectedType, receivedType)
+  ) {
+    message += ` with value ${styleValue(value, expectedType)}`
   }
   }
   message += `, got ${receivedType} `
   message += `, got ${receivedType} `
   // check if we need to specify received value
   // check if we need to specify received value
   if (isExplicable(receivedType)) {
   if (isExplicable(receivedType)) {
-    message += `with value ${receivedValue}.`
+    message += `with value ${styleValue(value, receivedType)}.`
   }
   }
   return message
   return message
 }
 }
@@ -231,9 +232,9 @@ function styleValue (value, type) {
   }
   }
 }
 }
 
 
+const EXPLICABLE_TYPES = ['string', 'number', 'boolean']
 function isExplicable (value) {
 function isExplicable (value) {
-  const explicitTypes = ['string', 'number', 'boolean']
-  return explicitTypes.some(elem => value.toLowerCase() === elem)
+  return EXPLICABLE_TYPES.some(elem => value.toLowerCase() === elem)
 }
 }
 
 
 function isBoolean (...args) {
 function isBoolean (...args) {

+ 10 - 0
test/unit/features/options/props.spec.js

@@ -241,6 +241,16 @@ describe('Options props', () => {
         makeInstance({}, Symbol)
         makeInstance({}, Symbol)
         expect('Expected Symbol, got Object').toHaveBeenWarned()
         expect('Expected Symbol, got Object').toHaveBeenWarned()
       })
       })
+
+      it('warns when expected an explicable type but Symbol was provided', () => {
+        makeInstance(Symbol('foo'), String)
+        expect('Expected String, got Symbol').toHaveBeenWarned()
+      })
+
+      it('warns when expected an explicable type but Symbol was provided', () => {
+        makeInstance(Symbol('foo'), [String, Number])
+        expect('Expected String, Number, got Symbol').toHaveBeenWarned()
+      })
     }
     }
 
 
     it('custom constructor', () => {
     it('custom constructor', () => {