【发布时间】:2021-03-30 05:26:33
【问题描述】:
所以我觉得我错过了一些明显的东西。我已经在非 React 上下文中阅读了有关 JSX 的文档,但我看不出我做错了什么。考虑以下代码:
/** @jsx pragma */
function pragma(node: any, props: any, ...children: any[]) {
return node;
}
declare namespace JSX {
type Element = string;
interface ElementChildrenAttribute {
children: {}; // specify children name to use
}
}
interface PropsType {
children: string;
name: string;
}
export const Prop = (props: PropsType) => {};
const foo = <Prop name="foo">hello</Prop>;
我得到的错误(在最后一行)是:
Property 'children' is missing in type '{ name: string; }' but required in type 'PropsType'.
我可以通过以下方式“纠正”这个问题:
const foo = <Prop name="foo" children="bye">hello</Prop>;
但我预计hello 将被分配为children。我不应该指定明确的children property,对吗?我在这里想念什么?我希望原件没问题(不会产生错误),因为在这种情况下,children 字段应该用字符串值"hello" 填充(并且不需要我添加children 属性?!?) .
我在这里缺少什么?我需要在此处填写 JSX 命名空间的其他类型/字段以使其正常工作吗?
澄清:我担心的是 TypeScript 没有将字符串“hello”分配给孩子。如果这样做,一切都会好起来的。因此,我的 prop 类型似乎不是问题,因为我在重新声明 JSX 命名空间时遗漏了一些东西,告诉编译器如何处理我的“自定义”JSX。
另外,确实我不需要在我的道具中有children。但我当然被允许而且我肯定想要这样做,因为这允许我缩小类型。正是出于这个原因,这绝对是允许的(参见第二段here)。在此处添加它并不会创建新的道具,它只是对JSX.ElementChildrenAttribute 中定义的内容进行改进。
【问题讨论】:
-
我比较熟悉直接用react使用children,但是children应该是JSX中默认的prop类型。从您的 propTypes 界面中删除子定义,并尝试通过 props.children[0] 直接访问文本。
-
我猜你正在读这个? typescriptlang.org/docs/handbook/… 我认为你不需要在 Proptypes 界面中使用 `children: string;`,因为它现在是“隐式”的
-
我确实需要它,因为我希望将更具体的类型约束应用于 Prop 而不仅仅是 {}。这在 TypeScript 的 JSX 实现中是明确允许的。
-
如果你想让孩子成为一个字符串,我只是使用你的代码没有任何错误。项目设置如何?我对 React 之外的 JSX 不太熟悉。
-
我正在运行 TypeScript 4.1.3。在 tsconfig.json 中,我将目标设置为“es2019”,将“jsx”设置为“react”。除了那些变化之外,我几乎是一个普通的 TS 项目。如果您无法使用这些设置进行复制,我将创建一个 repro-repo。
标签: typescript jsx