react propTypes && Typescript

最近看官方的文档,看到了 使用 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

你可能感兴趣的:(react.js)