Компонент Vue без рендеринга в TypeScript
У меня есть компонент без рендеринга в JavaScript, который я пытаюсь преобразовать в TypeScript. Я сталкиваюсь с ошибками при объявленииrender
функционировать в Vue.extend
-ed компонент:
(method) ComponentOptions<Vue, unknown, unknown, unknown, never[], Record<never, any>>.render?(createElement: CreateElement, hack: RenderContext<Record<never, any>>): VNode
No overload matches this call.
The last overload gave the following error.
Argument of type '{ render(): void; }' is not assignable to parameter of type 'ComponentOptions<Vue, DefaultData<Vue>, DefaultMethods<Vue>, DefaultComputed, PropsDefinition<Record<string, any>>, Record<string, any>>'.
Types of property 'render' are incompatible.
Type '() => void' is not assignable to type '(createElement: CreateElement, hack: RenderContext<Record<string, any>>) => VNode'.
Type 'void' is not assignable to type 'VNode'.ts(2769)
vue.d.ts(90, 3): The last overload is declared here.
Это пример того, что я пытаюсь сделать в TypeScript:
import Vue from 'vue'
export default Vue.extend({
render() { // error happens when I add this. I tried typing the render with :VNode
// and returning this.$scopedSlots.default({}), but error still occurs
}
})
Как это исправить?
1 ответ
Решение
render()
есть эта подпись:
render?(createElement: CreateElement, hack: RenderContext<Props>): VNode;
Примечания для render()
декларация:
hack
не нужно объявлять в вашем коде- объявления аргументов не нужны в функции без рендеринга
- тип возврата
VNode
(т.е. единственный корневой узел), но Vue фактически принимаетVNode[]
в качестве возврата (вот чтоthis.$scopedSlots.default()
возвращается)
Решение 1. Укажите тип возвращаемого значения какVNode
, и вернуть единственный узел, который обертывает this.$scopedSlots.default()
:
import Vue, { VNode, CreateElement } from 'vue'
export default Vue.extend({
render(h: CreateElement): VNode {
return h('div', this.$scopedSlots.default!({}))
}
})
Решение 2: используйтеany
Тип утверждения на this.$scopedSlots.default()
чтобы обойти ошибку типа:
import Vue from 'vue'
export default Vue.extend({
render() {
// The container node is expected to provide a single root,
// so it's okay to return `VNode[]` as any.
return this.$scopedSlots.default!({}) as any
}
})