PropTypes 转换 #
PropTypes 是 React 对 prop
的一种类型检查机制,但从 v15.5 开始,官方已经用 prop-types
库替代了 React.PropTypes
,在 TypeScript 项目中使用
JavaScript 库时需要下载声明文件 *.d.ts
,即下载对应的 @types/prop-types
,用法如下
React | + TypeScript |
---|---|
PropTypes.bool |
boolean |
PropTypes.func |
() => void |
PropTypes.number |
number |
PropTypes.object |
{} |
PropTypes.string |
string |
PropTypes.node |
React.ReactNode |
PropTypes.any |
any |
另外,强制类型检查方式也不一样,举个例子,前者用
isTrue: PropTypes.bool.isRequired
和 name: PropTypes.string
,后者用 isTrue: boolean
, name?:stirng
前面都是比较简单的,如果遇到复杂一点的呢,比如原项目中有如下 shape
定义:
export default PropTypes.arrayOf(
PropTypes.oneOfType([
fooShape,
PropTypes.shape({
a: PropTypes.any.isRequired,
b: PropTypes.arrayOf(fooShape).isRequired,
}),
]),
);
如何把它转化为 TypeScript 定义呢,我的解决方式结合 interface
和 type
:
interface BarShape {
a: any,
b: FooShape[]
}
export default type X = Array<FooShape | BarShape>;
以上内容有参考 stackoverflow,后来发现 TS spec 都已经写得很清楚了。当然,也并不是所有的 JavaScript 库都需要单独下载 .d.ts
文件,比如该项目中用到的nanoid
,作者已经提前写好了
enum #
有如下代码片段:
const ALIGNMENTS = {
MIDDLE: 'middle',
TOP: 'top',
};
...
class DualListBox extends React.Component {
static propTypes = {
alignActions: PropTypes.oneOf([ALIGNMENTS.MIDDLE, ALIGNMENT.TOP]),
...
};
static defaultProps = {
alignActions: ALIGNMENTS.MIDDLE,
...
};
render() {
return ();
};
};
这里 ALIGNMENTS 既可以用做类型检查又可以赋值给变量,但是在 TS 中 const
的方法,只能起一种作用,所以我采用了 enum
解决上述问题:
enum ALIGNMENTS {
MIDDLE = 'middle',
TOP = 'top',
}
FontAwesome #
原生,用 @types
过于繁琐了
CDN #
React 和 React DOM