对于初学者来说,我在此jsx: "preserve"
文件中使用了jsx.d.ts
,该文件来自Google对这个主题的快速搜索。
import Vue, {VNode} from "vue";
declare global {
namespace JSX {
interface Element extends VNode {}
interface ElementClass extends Vue {}
interface IntrinsicElements {
[elem: string]: any;
}
}
}
不幸的是,尽管我发现的所有内容几乎都提供了这个确切的声明文件,但是关于如何将JSX与自定义组件一起使用的结果并没有进一步深入。
就我而言,我有一个用Vue.extend()
定义的组件,希望在JSX中使用。此组件是名为SomeComponent.tsx
的文件中的默认导出。导致问题的代码如下所示。
import Vue, {CreateElement} from "vue";
import SomeComponent from "./SomeComponent.tsx";
export default Vue.extend({
name: "SomeOtherComponent",
functional: true,
render: (h: CreateElement) => (
<div class="something">
<SomeComponent
class="something-else"
someProp={1234}
>
Slot Content
</SomeComponent>
</div>
)
});
编译在第11行第9列失败,并显示以下消息:TS2339: Property 'class' does not exist on type 'ComponentOptions<Record<string, any> & Vue, DefaultData<Record<string, any> & Vue>, DefaultMethod...'
。
我了解它无法对自定义组件上class="something-else"
的使用进行类型检查。
摘自GitHub上的JSX in TypeScript提案:
<Something x={expr1} { ...spr } y={expr2} />
给定上例中从E
派生的元素属性类型Something
,该元素的属性按以下方式检查:如果属性是使用
P
初始化的普通属性expr
:
如果E
具有属性P
,请使用expr
类型的上下文类型处理E.P
。否则,发出错误。
如果expr
无法分配给E.P
,则会出错。
但是,我不知道/不了解的是我如何能够获得class
属性以正确地进行类型检查,即我需要以哪种方式调整{{1} }。
如果需要的话,我也可以禁用JSX的类型检查,但是我不确定我该怎么做。这是我到目前为止尝试过的。
根据上面链接的提案
如果元素类型为
jsx.d.ts
,则元素实例类型为any
。
我尝试通过将any
替换为JSX.ElementClass
来将any
设置为interface ElementClass extends Vue {}
,但是在相同的位置却因相同的错误而失败。
我还尝试根据{p>将type ElementClass = any
添加到我的interface ElementAttributesPropert {}
中
接口
jsx.d.ts
定义了此过程。它可能具有0个属性,在这种情况下,假定所有属性均为有效,并且类型为JSX.ElementAttributesProperty
,[...]。
这又产生了另一个错误,即
any
我知道这段代码应该有效,因为在手动删除TypeScript部件并接收到预期的输出之后,我已经通过Babel运行了该代码。
这是我所拥有的TS2322: Type '{ class: string; someProp: number; }' is not assignable to type 'CombinedVueInstance<Record<string, any> & Vue, object, object, object, Record<never, any>>'.
Type '{ class: string; someProp: number; }' is not assignable to type 'Vue'.
Property '$el' is missing in type '{ class: string; someProp: number; }'.
的定义。它几乎只是围绕SomeComponent
进行包装,以进行点击操作。像常规模板中的超级按钮一样工作,例如证监会<router-link />
。我尝试使用JSX解决此问题的唯一原因是this模板和功能组件存在问题。
<template>
答案 0 :(得分:1)
通过在namespace JSX
中的jsx.d.ts
中添加以下内容,我能够关闭JSX属性的类型检查:
type LibraryManagedAttributes<C, P> = {[name: string]: any};
(出于我尚未调查的原因,type LibraryManagedAttributes<C, P> = any;
无法正常工作。)
获得正确的类型检查将是定义JSX.LibraryManagedAttributes
以便根据组件类型计算组件的JSX属性类型的问题。但是this comment表示Vue的计算非常复杂(与React相比)。