Selaa lähdekoodia

support Symbol in props type validation (close #5396)

Evan You 9 vuotta sitten
vanhempi
commit
682141fccc
2 muutettua tiedostoa jossa 18 lisäystä ja 15 poistoa
  1. 8 15
      src/core/util/props.js
  2. 10 0
      test/unit/features/options/props.spec.js

+ 8 - 15
src/core/util/props.js

@@ -129,23 +129,16 @@ function assertProp (
   }
 }
 
-/**
- * Assert the type of a value
- */
+const simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/
+
 function assertType (value: any, type: Function): {
-  valid: boolean,
-  expectedType: ?string
+  valid: boolean;
+  expectedType: string;
 } {
   let valid
-  let expectedType = getType(type)
-  if (expectedType === 'String') {
-    valid = typeof value === (expectedType = 'string')
-  } else if (expectedType === 'Number') {
-    valid = typeof value === (expectedType = 'number')
-  } else if (expectedType === 'Boolean') {
-    valid = typeof value === (expectedType = 'boolean')
-  } else if (expectedType === 'Function') {
-    valid = typeof value === (expectedType = 'function')
+  const expectedType = getType(type)
+  if (simpleCheckRE.test(expectedType)) {
+    valid = typeof value === expectedType.toLowerCase()
   } else if (expectedType === 'Object') {
     valid = isPlainObject(value)
   } else if (expectedType === 'Array') {
@@ -166,7 +159,7 @@ function assertType (value: any, type: Function): {
  */
 function getType (fn) {
   const match = fn && fn.toString().match(/^\s*function (\w+)/)
-  return match && match[1]
+  return match ? match[1] : ''
 }
 
 function isType (type, fn) {

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

@@ -1,4 +1,5 @@
 import Vue from 'vue'
+import { hasSymbol } from 'core/util/env'
 
 describe('Options props', () => {
   it('array syntax', done => {
@@ -205,6 +206,15 @@ describe('Options props', () => {
       expect('Expected Array').toHaveBeenWarned()
     })
 
+    if (hasSymbol) {
+      it('symbol', () => {
+        makeInstance(Symbol('foo'), Symbol)
+        expect(console.error.calls.count()).toBe(0)
+        makeInstance({}, Symbol)
+        expect('Expected Symbol').toHaveBeenWarned()
+      })
+    }
+
     it('custom constructor', () => {
       function Class () {}
       makeInstance(new Class(), Class)