【发布时间】:2017-01-09 13:19:54
【问题描述】:
我开始使用 React 和 Typescript 开发应用程序。顺便说一句,我是两件事的新手。
我有一个 react 组件和一些接口,我希望该接口中的每个字段都是必需的,但如果实现了一个特定字段,则其他字段不再需要。
在这种情况下,如果我设置“对象”,我希望不需要实现其他 2 个字段。
interface ITextFieldProps {
label: string,
required: boolean,
object?: any
}
export default class TextField extends React.Component<ITextFieldProps, any> {
...
}
希望有人能帮忙,干杯!
编辑
首先我要感谢所有的答案,我真的从他们每个人那里学到了很多。他们帮助我了解我的问题并找到最佳解决方案。
我将传递的对象是元数据,因此它仅在 http 调用后在运行时可用。话虽如此,我还是无法在开发时检查和输入它。
所以我使用 react props spread 解决了我的问题。
(今天typescript不支持,但总有一天会的,嘿嘿https://github.com/Microsoft/TypeScript/issues/2103):
export interface IMetadata {
label: string,
required: boolean
}
interface TextFieldProps extends IMetadata {
...
}
这样我可以传递一个传播了道具的对象,然后当我调用 label="" 时,它会自动覆盖 {...this.metadata.nome} 中的标签:
<TextField {...this.metadata.nome} label="OverwriteLabel" />
编辑 2
正如丹尼尔所说: 不幸的是,JSX 中的类型检查有一个错误,请参阅:
https://github.com/Microsoft/TypeScript/issues/10171
他们计划在 2.1 中修复它。在那之前,这种技术不适用于 TSX。 (当它修复后,我会回来更新这个答案。)
【问题讨论】:
-
对象的结构是完全未知的吗?如果是这样,在这种情况下您如何获得
label和required?我的建议是固定界面并在必要时将对象映射到正确的道具。在我看来,拥有“聪明”的组件可能会根据你扔给它们的东西来做一件事或另一件事只会让事情变得更加复杂。 -
实际上对象是已知的,它将是一个具有所有这些属性(标签、必需和许多其他)的 json,最好的场景是传递对象,因此开发人员不需要写太多,但如果他没有那个对象并且需要使用该组件,该组件将需要界面中的那些 X 道具...@TomFenech
标签: reactjs typescript interface