@@ -287,36 +287,23 @@ export function assertProp (prop, value, vm) {
287
287
}
288
288
var options = prop . options
289
289
var type = options . type
290
- var valid = true
291
- var expectedType
290
+ var valid = ! type
291
+ var expectedTypes = [ ]
292
292
if ( type ) {
293
- if ( type === String ) {
294
- expectedType = 'string'
295
- valid = typeof value === expectedType
296
- } else if ( type === Number ) {
297
- expectedType = 'number'
298
- valid = typeof value === 'number'
299
- } else if ( type === Boolean ) {
300
- expectedType = 'boolean'
301
- valid = typeof value === 'boolean'
302
- } else if ( type === Function ) {
303
- expectedType = 'function'
304
- valid = typeof value === 'function'
305
- } else if ( type === Object ) {
306
- expectedType = 'object'
307
- valid = isPlainObject ( value )
308
- } else if ( type === Array ) {
309
- expectedType = 'array'
310
- valid = isArray ( value )
311
- } else {
312
- valid = value instanceof type
293
+ if ( ! isArray ( type ) ) {
294
+ type = [ type ]
295
+ }
296
+ for ( var i = 0 ; i < type . length && ! valid ; i ++ ) {
297
+ var assertedType = assertType ( value , type [ i ] )
298
+ expectedTypes . push ( assertedType . expectedType )
299
+ valid = assertedType . valid
313
300
}
314
301
}
315
302
if ( ! valid ) {
316
303
if ( process . env . NODE_ENV !== 'production' ) {
317
304
warn (
318
305
'Invalid prop: type check failed for prop "' + prop . name + '".' +
319
- ' Expected ' + formatType ( expectedType ) +
306
+ ' Expected ' + formatTypes ( expectedTypes ) +
320
307
', got ' + formatValue ( value ) + '.' ,
321
308
vm
322
309
)
@@ -353,9 +340,46 @@ export function coerceProp (prop, value) {
353
340
return coerce ( value )
354
341
}
355
342
356
- function formatType ( val ) {
357
- return val
358
- ? val . charAt ( 0 ) . toUpperCase ( ) + val . slice ( 1 )
343
+ function assertType ( value , type ) {
344
+ var valid
345
+ var expectedType
346
+ if ( type === String ) {
347
+ expectedType = 'string'
348
+ valid = typeof value === expectedType
349
+ } else if ( type === Number ) {
350
+ expectedType = 'number'
351
+ valid = typeof value === expectedType
352
+ } else if ( type === Boolean ) {
353
+ expectedType = 'boolean'
354
+ valid = typeof value === expectedType
355
+ } else if ( type === Function ) {
356
+ expectedType = 'function'
357
+ valid = typeof value === expectedType
358
+ } else if ( type === Object ) {
359
+ expectedType = 'object'
360
+ valid = isPlainObject ( value )
361
+ } else if ( type === Array ) {
362
+ expectedType = 'array'
363
+ valid = isArray ( value )
364
+ } else {
365
+ valid = value instanceof type
366
+ }
367
+ return {
368
+ valid,
369
+ expectedType
370
+ }
371
+ }
372
+
373
+ function formatTypes ( types ) {
374
+ return types . reduce (
375
+ ( p , c , i ) => { return i === 0 ? formatType ( c ) : `${ p } , ${ formatType ( c ) } ` } ,
376
+ ''
377
+ )
378
+ }
379
+
380
+ function formatType ( type ) {
381
+ return type
382
+ ? type . charAt ( 0 ) . toUpperCase ( ) + type . slice ( 1 )
359
383
: 'custom type'
360
384
}
361
385
0 commit comments