|
|
@@ -4,12 +4,12 @@ import { hasOwn, isObject, isPlainObject, capitalize, hyphenate } from 'shared/u
|
|
|
import { observe, observerState } from '../observer/index'
|
|
|
import { warn } from './debug'
|
|
|
|
|
|
-type PropOptions = {
|
|
|
- type: Function | Array<Function> | null,
|
|
|
- default: any,
|
|
|
- required: ?boolean,
|
|
|
- validator: ?Function
|
|
|
-}
|
|
|
+// type PropOptions = {
|
|
|
+// type: Function | Array<Function> | null,
|
|
|
+// default: any,
|
|
|
+// required: ?boolean,
|
|
|
+// validator: ?Function
|
|
|
+// }
|
|
|
|
|
|
export function validateProp (
|
|
|
key: string,
|
|
|
@@ -23,7 +23,7 @@ export function validateProp (
|
|
|
const absent = !hasOwn(propsData, key)
|
|
|
let value = propsData[key]
|
|
|
// handle boolean props
|
|
|
- if (prop.type === Boolean) {
|
|
|
+ if (getType(prop.type) === 'Boolean') {
|
|
|
if (absent && !hasOwn(prop, 'default')) {
|
|
|
value = false
|
|
|
} else if (value === '' || value === hyphenate(key)) {
|
|
|
@@ -131,27 +131,20 @@ function assertType (value: any, type: Function): {
|
|
|
expectedType: string
|
|
|
} {
|
|
|
let valid
|
|
|
- let expectedType
|
|
|
- if (type === String) {
|
|
|
- expectedType = 'string'
|
|
|
- valid = typeof value === expectedType
|
|
|
- } else if (type === Number) {
|
|
|
- expectedType = 'number'
|
|
|
- valid = typeof value === expectedType
|
|
|
- } else if (type === Boolean) {
|
|
|
- expectedType = 'boolean'
|
|
|
- valid = typeof value === expectedType
|
|
|
- } else if (type === Function) {
|
|
|
- expectedType = 'function'
|
|
|
- valid = typeof value === expectedType
|
|
|
- } else if (type === Object) {
|
|
|
- expectedType = 'Object'
|
|
|
+ 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')
|
|
|
+ } else if (expectedType === 'Object') {
|
|
|
valid = isPlainObject(value)
|
|
|
- } else if (type === Array) {
|
|
|
- expectedType = 'Array'
|
|
|
+ } else if (expectedType === 'Array') {
|
|
|
valid = Array.isArray(value)
|
|
|
} else {
|
|
|
- expectedType = type.name || type.toString()
|
|
|
valid = value instanceof type
|
|
|
}
|
|
|
return {
|
|
|
@@ -159,3 +152,13 @@ function assertType (value: any, type: Function): {
|
|
|
expectedType
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Use function string name to check built-in types,
|
|
|
+ * because a simple equality check will fail when running
|
|
|
+ * across different vms / iframes.
|
|
|
+ */
|
|
|
+function getType (fn) {
|
|
|
+ const match = fn && fn.toString().match(/^function (\w+)/)
|
|
|
+ return match && match[1]
|
|
|
+}
|