2 回答
TA贡献1735条经验 获得超5个赞
有一种特殊的方法可以直接调用propTypescheck以重用其检查逻辑:PropTypes.checkPropTypes()
data: (props, propName, componentName) => {
if (props.useCustomSuggestion) { // data should be validated but is optional
PropTypes.checkPropTypes({
[propName]: PropTypes.arrayOf(
PropTypes.shape({
value: PropTypes.string.isRequired,
id: PropTypes.number.isRequired
})
)
},
props,
propName,
componentName
);
} else { // data is required
PropTypes.checkPropTypes({
[propName]: PropTypes.arrayOf(
PropTypes.shape({
value: PropTypes.string.isRequired,
id: PropTypes.number.isRequired
})
).isRequired
},
props,
propName,
componentName
);
}
}
PS出于未知原因,代码propTypes和框有时会运行检查,有时会默默地跳过它,所以我的代码示例不是100%有效。但是我已经用string/检查了方法number- 就在我试图采用它时arrayOf/shape它开始变得奇怪。
可能您将能够将公共部分(shape的内部)移动到 interterm 变量以减少代码重复,但正如我所说的无法确保。
TA贡献1840条经验 获得超5个赞
这似乎可以解决问题,如果有人有更简洁的答案,或对以下代码的反馈,请仍然发表评论或发布您自己的答案。
data: (props) => {
if (!props.useCustomSuggestions && !props.data) {
return new Error('Data must be provided to use default suggestions');
} else if (props.data && !Array.isArray(props.suggestions)) {
return new Error('Data must be an array');
} else if (props.data.length > 0) {
for (let i = 0; i < props.data.length; i += 1) {
if (!props.data[i].value || !props.data[i].id) {
return new Error(
'Objects in data must include properties "value" and "id"',
);
} else if (
typeof props.data[i].value !== 'string' ||
typeof props.data[i].id !== 'number'
) {
return new Error(
'Objects in data array must have property "value" of type string, and "id" of type number',
);
}
}
}
},
添加回答
举报