TypeScript

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.isRequiredname: PropTypes.string ,后者用 isTrue: booleanname?:stirng

前面都是比较简单的,如果遇到复杂一点的呢,比如原项目中有如下 shape 定义:

export default PropTypes.arrayOf(
    PropTypes.oneOfType([
      fooShape,
      PropTypes.shape({
	  a: PropTypes.any.isRequired,
	  b: PropTypes.arrayOf(fooShape).isRequired,
      }),
    ]),
);

如何把它转化为 TypeScript 定义呢,我的解决方式结合 interfacetype

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

Fork me on GitHub