Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(runtime-core): custom type props warning #7198

Merged
merged 4 commits into from Nov 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
36 changes: 36 additions & 0 deletions packages/runtime-core/__tests__/componentProps.spec.ts
Expand Up @@ -321,6 +321,42 @@ describe('component props', () => {
expect(`Missing required prop: "num"`).toHaveBeenWarned()
})

test('warn on type mismatch', () => {
class MyClass {

}
const Comp = {
props: {
bool: { type: Boolean },
str: { type: String },
num: { type: Number },
arr: { type: Array },
obj: { type: Object },
cls: { type: MyClass },
fn: { type: Function },
},
setup() {
return () => null
}
}
render(h(Comp, {
bool: 'true',
str: 100,
num: '100',
arr: {},
obj: 'false',
cls: {},
fn: true,
}), nodeOps.createElement('div'))
expect(`Invalid prop: type check failed for prop "bool". Expected Boolean, got String`).toHaveBeenWarned()
expect(`Invalid prop: type check failed for prop "str". Expected String with value "100", got Number with value 100.`).toHaveBeenWarned()
expect(`Invalid prop: type check failed for prop "num". Expected Number with value 100, got String with value "100".`).toHaveBeenWarned()
expect(`Invalid prop: type check failed for prop "arr". Expected Array, got Object`).toHaveBeenWarned()
expect(`Invalid prop: type check failed for prop "obj". Expected Object, got String with value "false"`).toHaveBeenWarned()
expect(`Invalid prop: type check failed for prop "fn". Expected Function, got Boolean with value true.`).toHaveBeenWarned()
expect(`Invalid prop: type check failed for prop "cls". Expected MyClass, got Object`).toHaveBeenWarned()
})

// #3495
test('should not warn required props using kebab-case', async () => {
const Comp = {
Expand Down
4 changes: 2 additions & 2 deletions packages/runtime-core/src/componentProps.ts
Expand Up @@ -557,8 +557,8 @@ function validatePropName(key: string) {
// use function string name to check type constructors
// so that it works across vms / iframes.
function getType(ctor: Prop<any>): string {
const match = ctor && ctor.toString().match(/^\s*function (\w+)/)
return match ? match[1] : ctor === null ? 'null' : ''
const match = ctor && ctor.toString().match(/^\s*(function|class) (\w+)/)
return match ? match[2] : ctor === null ? 'null' : ''
}

function isSameType(a: Prop<any>, b: Prop<any>): boolean {
Expand Down