javascript - React 中有没有办法更改道具类型以避免 TypeErrors?
问题描述
我想知道如果传递的道具类型不是预期的类型,是否有办法更改道具类型。
例如,如果我的组件希望接收一个对象(使用 PropTypes 或使用 TypeScript 表示法),但传递了一个数组,则该数组应转换为一个对象(它可以是一个空对象)。
有没有办法存档这个?
例子:
const array = [1, 2, 3];
<Component name={array} />
然后在我的组件内部:
const Component({ name }) {
console.log(typeof name);
// output: 'string'
console.log(name);
// output: ''
return (
<div />
);
}
Component.propTypes = {
name: PropTypes.string
}
解决方案
您可能想要使用泛型类型。记录为:
软件工程的一个主要部分是构建组件,这些组件不仅具有定义明确且一致的 API,而且还可以重用。能够处理今天和明天的数据的组件将为您提供构建大型软件系统的最灵活的能力。
在 C# 和 Java 等语言中,工具箱中用于创建可重用组件的主要工具之一是泛型,也就是说,能够创建一个可以在多种类型而不是单一类型上工作的组件。这允许用户使用这些组件并使用他们自己的类型。
然后,您可以转换为所需的类型:
const convert2Array = <T>(prop: T): T[] => {
let arr: T[];
if (Array.isArray(prop)) {
arr = prop;
} else if (typeof prop === 'object' && prop !== null) {
arr = Object.values(prop);
} else {
arr = [prop];
}
return arr;
};
convert2Array('str'); // ['str']
convert2Array(7); // [7]
convert2Array(['an', 'existing', 'array']); // ['an', 'existing', 'array']
convert2Array({foo: 'bar', zip: 'zap'}); // ['bar', 'zap']
推荐阅读
- jython - 如何在同一个文件中读取最后一个值、增量和追加:Jython
- jsp - 如何在 Liferay DXP 7.3.10 GA1 中覆盖 update_password.jsp
- ios - ATT 会影响除广告跟踪之外的一般 Firebase 和谷歌分析吗?
- wordpress - MYSQL选择相邻记录/与易于选择的记录共享键的记录
- c++ - FFMPEG:“服务器回复中的传输不匹配”但 openRTSP 有效
- macos - 在我的 Mac 上使用 Mission Control 时,有时窗口会随机变为不可见
- amazon-web-services - AWS ECS 集群:创建第二个实例,移动容器
- python - 错误:“numpy.int64”对象在推荐系统中不可迭代
- c++ - 是否可以从 cpp 模块导出 constexpr 函数指针?
- python - 您如何允许用户控制海龟并在悬停在所需位置上时为这些坐标执行特定功能