我正在尝试将Union类型用于React组件的道具
type Props =
| {
type: "string"
value: string
}
| {
type: "number"
value: number
}
| {
type: "none"
}
class DynamicProps extends React.Component<Props> {
render() {
return null
}
}
// Ok
const string_jsx = <DynamicProps type="string" value="hello" />
// Error as expected, value should be a string
const string_jsx_bad = <DynamicProps type="string" value={5} />
// Ok
const number_jsx = <DynamicProps type="number" value={5} />
// Error as expcted value should be a number
const number_jsx_bad = <DynamicProps type="number" value="hello" />
// Error as expected, invalid isn't a property on any of the unioned types
const extra = <DynamicProps type="string" value="extra" invalid="what" />
// No error? There should be no value when type="none"
const none_jsx = <DynamicProps type="none" value="This should be an error?" />
// Ok, seems like value has become optional
const none2_jsx = <DynamicProps type="none" />
// Error as expected, value is not present. Value doesn't seem to be made optional all the time
const required = <DynamicProps type="string" />
似乎部分起作用,因为type
有效道具会根据道具而改变。但是,虽然没有出现在联合中的任何类型上的额外属性将是一个错误,但似乎出现在至少一个联合类型中但不基于判别属性的类型将不是错误。
我不确定为什么会这样。使用联合类型作为反应组件的道具是否是反模式?
当涉及工会时,问题与多余的财产检查有关。您可以在此处阅读类似问题的答案。其要旨是,对联合的多余属性检查允许对象上存在任何成员的任何键。我们可以通过引入额外的类型的成员来避免这种情况,即永远不要确保具有过多属性的对象不会与特定成员错误地兼容:
type Props =
| {
type: "string"
value: string
}
| {
type: "number"
value: number
}
| {
type: "none"
}
type UnionKeys<T> = T extends any ? keyof T : never;
type StrictUnionHelper<T, TAll> = T extends any ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
type StrictUnion<T> = StrictUnionHelper<T, T>
class DynamicProps extends React.Component<StrictUnion<Props>> {
render() {
return null
}
}
// error now
const none_jsx = <DynamicProps type="none" value="This should be an error?" />
下面是React Native教程:https://facebook.github.io/react-native/docs/animated.html 但是,当我运行代码时,我得到了以下警告:失败的道具类型:无效的道具类型提供给 而组件只是消失时,没有动画淡出()得到调用。 下面是一个示例代码:
我收到警告“警告:失败的道具类型:提供给的类型为
我有这段代码: ref是在一个IonList元素中定义的,但它表示display不存在于该元素中。我怎样才能做到这一点?我见过其他类似的帖子:post和it都没用
大家好,我正在尝试实现一个自定义TextView与字体。我决定使用RobotoTextView。我在资产中也有字体文件夹。我在时出错。 错误:
我试图展示一个简单的例子。通过将图像路径作为道具发送到要渲染它的组件,来创建jpg图像。以下面的方式。 应用程序。js 图像显示。js 图像lider.js 我的文件夹结构是: 理想情况下,当我通过本地存储的图像路径时,图像应该被显示,但是我没有看到任何图像显示,而是一条警告消息,上面写着:“失败的道具类型:无效的道具‘源’提供给‘转发参考(图像)’”
我得到这个错误: index.js:1375警告:失败的道具类型:提供给的道具无效。 我在我的应用程序中使用了一个外部组件,它是从github获得的,可以在后台渲染视频。这里是链接。https://github.com/samAbeywickrama/reactjs-videobg 它与proptypes有关,但由于它的遗留和react建议使用flo,所以我根本不使用类型检查。