【发布时间】:2017-05-24 06:18:04
【问题描述】:
我想在 TypeScript 中使用 JSX 语法,但我不想使用 React。
我在 SO 上看到了其他相关问题的答案,但没有任何内容完整或详细到足以提供任何帮助。我已经阅读了手册中的this guide 和JSX chapter,但并没有多大帮助。我不明白语言功能本身是如何工作的。
我已经尝试检查 React 声明,但它对我来说太大而无法吸收 - 我需要一个最小的工作示例来演示经过类型检查的元素、组件和属性。 (它不需要工厂函数的有效实现,我最感兴趣的是声明。)
我想要的至少是一个示例,它使以下工作具有类型安全性:
var el = <Ping blurt="ya"></Ping>;
var div = <div id="foo">Hello JSX! {el}</div>;
我假设我至少需要声明 JSX.IntrinsicElements,以及某种形式的 createElement() 工厂函数,但这就是我所得到的:
declare module JSX {
interface IntrinsicElements {
div: flurp.VNode<HTMLDivElement>;
}
}
module flurp {
export interface VNode<E extends Element> {
id: string
}
export function createElement<T extends Element>(type: string, props?: any, ...children: (VNode<Element>|string)[]): VNode<Element> {
return {
id: props["id"]
};
}
}
class Ping {
// ???
}
var el = <Ping blurt="ya"></Ping>;
var div = <div id="foo">Hello JSX! {el}</div>;
我用tsconfig.json 编译这个:
{
"compilerOptions": {
"target": "es5",
"jsx": "react",
"reactNamespace": "flurp"
}
}
将鼠标悬停在 <div> 元素和 id="foo" 属性上,我可以看到编译器理解了我对内在元素的声明 - 到目前为止,一切都很好。
现在,要编译 <Ping blurt="ya"> 声明,并对 blurt 属性进行类型检查,我该怎么做? Ping 甚至应该是 class 还是 function 或其他什么?
理想情况下,元素和组件应该有某种共同的祖先,这样我就可以拥有一组适用于两者的共同属性。
我希望创建一些简单而轻量级的东西,可能类似于monkberry,但使用 JSX 语法,例如使用 <If> 和 <For> 之类的组件,而不是内联语句。这甚至可行吗? (有没有我可以参考的现有项目?)
请,如果有人能提供一个如何使用语言功能本身的有效的最小示例,那将是一个巨大的帮助!
【问题讨论】:
-
抱歉,您是否对答案进行了罚款?你能举个例子吗?
标签: typescript jsx