From 4ff11301ed4009d60e035e27d6a54332396fb099 Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 23 Oct 2024 14:15:21 +0800 Subject: [PATCH 1/2] fix(runtime-core): handle validate prop check edge case --- packages/runtime-core/src/componentProps.ts | 4 ++++ packages/shared/src/toDisplayString.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 8baa7808665..5dd69398746 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -21,7 +21,9 @@ import { isOn, isReservedProp, isString, + isSymbol, makeMap, + stringifySymbol, toRawType, } from '@vue/shared' import { warn } from './warning' @@ -795,6 +797,8 @@ function styleValue(value: unknown, type: string): string { return `"${value}"` } else if (type === 'Number') { return `${Number(value)}` + } else if (isSymbol(value)) { + return stringifySymbol(value) } else { return `${value}` } diff --git a/packages/shared/src/toDisplayString.ts b/packages/shared/src/toDisplayString.ts index b23cf766a5c..ff5e088e636 100644 --- a/packages/shared/src/toDisplayString.ts +++ b/packages/shared/src/toDisplayString.ts @@ -61,7 +61,7 @@ const replacer = (_key: string, val: unknown): any => { return val } -const stringifySymbol = (v: unknown, i: number | string = ''): any => +export const stringifySymbol = (v: unknown, i: number | string = ''): any => // Symbol.description in es2019+ so we need to cast here to pass // the lib: es2016 check isSymbol(v) ? `Symbol(${(v as any).description ?? i})` : v From 8e6a77db47c228550316188a48d68a3edab74ae5 Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 23 Oct 2024 14:24:40 +0800 Subject: [PATCH 2/2] test: add test case --- packages/runtime-core/__tests__/componentProps.spec.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/runtime-core/__tests__/componentProps.spec.ts b/packages/runtime-core/__tests__/componentProps.spec.ts index b8eb0e47208..950d9c48de1 100644 --- a/packages/runtime-core/__tests__/componentProps.spec.ts +++ b/packages/runtime-core/__tests__/componentProps.spec.ts @@ -413,6 +413,7 @@ describe('component props', () => { fn: { type: Function }, skipCheck: { type: [Boolean, Function], skipCheck: true }, empty: { type: [] }, + foo: { type: Boolean }, }, setup() { return () => null @@ -429,6 +430,7 @@ describe('component props', () => { fn: true, skipCheck: 'foo', empty: [1, 2, 3], + foo: Symbol(), }), nodeOps.createElement('div'), ) @@ -459,6 +461,9 @@ describe('component props', () => { expect( `Prop type [] for prop "empty" won't match anything. Did you mean to use type Array instead?`, ).toHaveBeenWarned() + expect( + `[Vue warn]: Invalid prop: type check failed for prop "foo". Expected Boolean, got Symbol`, + ).toHaveBeenWarned() }) // #3495