最近看官网的文档,看到了 应用 PropTypes 进行类型查看 这一章节,看完之后发现这玩意和typeScript 很相似,所以查找了一些材料,发现他们是能够相互转换的,上面来看一些例子:
根本类型的定义
PropTypes写法:
// 当然要引入(以下省略)import PropTypes from 'prop-types';Example.propTypes = { message: PropTypes.string, // 定义 string 类型 count: PropTypes.number, // 定义 number 类型 disabled: PropTypes.bool, // 定义 boolen 类型 level: PropTypes.symbol, // 定义 symbol 类型}
TypeScript 的写法:
interface Props { message: string; count: number; disabled: boolean; level: Symbol;}
一些非凡的类型
PropTypes写法:
Example.propTypes = { error: PropTypes.instanceOf(Error), // 是否是 error 实例 children: PropTypes.node, // 定义 元素 status: PropTypes.oneOf(['inactive', 'inProgress', 'success', 'failed']), // 定义指定值,必须为 'inactive', 'inProgress', 'success', 'failed' 中的一个 value: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.instanceOf(Error), ]), // 必须为这几种类型中的一种}
TypeScript 的写法:
interface Props { error: Error; children: React.ReactNode; status: 'inactive' | 'inProgress' | 'success' | 'failed'; value: string | number | Error;}
数组和对象
PropTypes写法:
Example.propTypes = { style: PropTypes.shape({ color: PropTypes.string, fontSize: PropTypes.number, }), // 指定这个对象由特定的类型值组成 person: PropTypes.exact({ name: PropTypes.string, age: PropTypes.number, employed: PropTypes.bool, status: PropTypes.oneOf([ 'single', 'dating', 'engaged', 'married', 'divorced', 'widowed', 'other', ]), }), // // An object with warnings on extra properties names: PropTypes.arrayOf(PropTypes.string), // 必须 值全是 string 类型的数组 items: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.number, title: PropTypes.string, active: PropTypes.boolean, }), ),}
TypeScript 的写法:
interface Props { style: { color: string fontSize: number }; person: { name: string age: number employed: boolean status: | 'single' | 'dating' | 'engaged' | 'married' | 'divorced' | 'widowed' | 'other' }; names: string[]; items: { id: number title: string active: boolean }[];}
函数
PropTypes写法:
Example.propTypes = { onClick: PropTypes.func, onChange: PropTypes.func, onSelect: PropTypes.func,}
TypeScript 的写法:
interface Props { onClick: () => void onChange: (val: string) => void onSelect: (id: string, val: number) => void}
必须参数的写法
PropTypes写法:
Example.propTypes = { description: PropTypes.string.isRequired, isActive: PropTypes.bool,}
TypeScript 的写法:
interface Props { description: string isActive?: boolean}
总结
在 TypeScript React 应用程序中应用 PropTypes 没有什么太大的价值,通过下面的例子也能够看出 TypeScript 的写法比较简单易懂
参考:
React Prop Types with TypeScript
PropTypes in a TypeScript React Application