const e = container.childNodes[0] as VueElement
expect(e.shadowRoot!.innerHTML).toBe('hello')
})
+
+ test('prop types validation', async () => {
+ const E = defineCustomElement({
+ props: {
+ num: {
+ type: [Number, String],
+ },
+ bool: {
+ type: Boolean,
+ },
+ },
+ render() {
+ return h('div', [
+ h('span', [`${this.num} is ${typeof this.num}`]),
+ h('span', [`${this.bool} is ${typeof this.bool}`]),
+ ])
+ },
+ })
+
+ customElements.define('my-el-with-type-props', E)
+ render(h('my-el-with-type-props', { num: 1, bool: true }), container)
+ const e = container.childNodes[0] as VueElement
+ // @ts-expect-error
+ expect(e.num).toBe(1)
+ // @ts-expect-error
+ expect(e.bool).toBe(true)
+ expect(e.shadowRoot!.innerHTML).toBe(
+ '<div><span>1 is number</span><span>true is boolean</span></div>',
+ )
+ })
})
describe('attrs', () => {
this._root = this
}
}
-
- if (!(this._def as ComponentOptions).__asyncLoader) {
- // for sync component defs we can immediately resolve props
- this._resolveProps(this._def)
- }
}
connectedCallback(): void {
}
}
this._numberProps = numberProps
-
- if (isAsync) {
- // defining getter/setters on prototype
- // for sync defs, this already happened in the constructor
- this._resolveProps(def)
- }
+ this._resolveProps(def)
// apply CSS
if (this.shadowRoot) {