reactjs - 将非类型化字符串传递给带有类型化道具的 React 组件时出现 TypeScript 错误?
问题描述
我有一个图标组件:
type Props = {
icon:
| "one"
| "two";
}
const Icon: React.FC<Props> = ({ icon }) => {
// generate icon
}
如果我在另一个具有硬编码值的组件中使用它,一切都很好:
const MyComponent = () => {
return(
<div>
<Icon icon="one" />
</div>
)
}
但是,当它从道具动态设置时,即使图标显示正确,我也会收到 TypeScript 错误:
type Props = {
icon?: string;
};
const MyComponent: React.FC<Props> = ({ icon }) => {
return(
<div>
{
icon && <Icon icon={icon} />
}
</div>
)
}
TS2322:类型“字符串”不可分配给类型“一”| “二”。
index.tsx(8, 3):预期类型来自属性 'icon',它在此处声明类型为 'IntrinsicAttributes & Props & { children?: ReactNode; }'
这是因为 TypeScript 不知道传递的字符串值是“一”还是“二”?
如果是这样,那么我能想到的唯一解决方案是将“一”和“二”导出为枚举。但是,这会使组件使用起来很烦人,因为您总是必须导入此枚举,而不仅仅是传递您想要的字符串。有没有更优雅的解决方案?
解决方案
组件中的道具只有一个或两个联合值,但是在您使用组件的地方,它的数据类型由可选的字符串变量定义,因此它是不匹配的
type Props = {
icon:
| "one"
| "two";
}
type Props = {
icon?: string;
};
要修复它,您需要使这两者保持一致
type Props = {
icon?: "one"|"two";
};
推荐阅读
- java - 将带有附加节点的 XML 转换为 Java 对象
- java - 调用 api 时出错(类型=不可接受,状态=406)
- android - 带有 RecyclerView Android 的动态标签
- javascript - moment.isoWeekday 不是函数
- css - 不能将 div 排列在另一个之下
- python - 如何将时空数据重塑为 lstm 输入?
- xpages - 通过复合数据上的 getComponent 获取价值
- angular - ngStyle 函数在条件下运行
- python - 无法将 anaconda 上的 python 包更新到最新版本
- django - Django - 如何创建由外键分隔的复选框表单