美文网首页
TypeScript(-1):ts + react 常用知识点

TypeScript(-1):ts + react 常用知识点

作者: 林ze宏 | 来源:发表于2021-05-17 18:34 被阅读0次

    目录

    • 1 class 组件 props 约束
    • 2 class 组件 state 约束
    • 3 函数组件 props 约束
    • 4 useState 约束

    1 class 组件参数 props 约束

    可以使用接口 interface 或者 类型 type 对类的 props 进行约束,如下:

    interface IProps {
      name: string;
      age?: number;
    }
    
    或者
    
    type IProps = {
       name: string;
      age?: number;
    }
    
    class Form extends React.Component<IProps> {
      ...
    }
    
    

    2 class 组件的 state 约束

    • 第一种方式,对 class 类的 state 状态进行约束,可以通过在类头部新增约束,如下:
    interface IProps {
      data: string;
    }
    
    interface IState {
      name: string;
      age: number;
    }
    
    class Form extends React.Component<IProps, IState> {
      state = {
        name: '1111',
        age: 11
      }
      ...
    }
    
    
    • 另外,可以直接在 state 后面新增约束,如下:
    interface IProps {
      data: string;
    }
    
    interface IState {
      name: string;
      age: number;
    }
    
    class Form extends React.Component<IProps> {
      state: IState = {
        name: '1111',
        age: 11
      }
      ...
    }
    
    

    3 函数组件 props 约束

    与 class 组件相比,函数组件约束 props,会有所不同,代码如下:

    import React from 'react';
    
    interface IProps {
      data: string;
    }
    
    const Func = (props: IProps) => {
      ...
    }
    
    export default Func;
    
    

    同时,也可以对 props 参数进行解构,如下:

    import React from 'react';
    
    interface IProps {
      data: string;
    }
    
    const Func = ({ data }: IProps) => {
      ...
    }
    
    export default Func;
    
    

    另外,也是可以利用 React.FunctionComponent,对函数组件进行 泛型 约束,代码如下:

    import React from 'react';
    
    interface IProps {
      data: string;
    }
    
    const Func: React.FunctionComponent<IProps> = ({ data }) => {
      ...
    }
    
    export default Func;
    
    

    4 useState 约束

    const [name, setName] = useState<string>('');
    

    5 input onChange 事件, event 参数参数约束

    export interface IInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
      /** input 大小 */
      size?: InputSize;
      /** input 是否禁用 */
      disabled?: boolean;
      /** input 图标 */
      icon?: React.ReactNode;
      /** input 前缀 */
      prepend?: string | ReactElement;
      /** input 后缀 */
      suffix?: string;
      /** input 类名 */
      className?: string;
      /** onChange 事件 */
      onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
    }
    
    
    <Input
      placeholder="请输入"
      className="my-input"
      size="md"
      prepend="https://"
      suffix=".com"
      icon={<SearchOutlined />}
      onChange={e => onChangeInput(e)}
      defaultValue="1212"
      value="323"
    />
    
    
    function onChangeInput(e: React.ChangeEvent<HTMLInputElement>) {
      console.log(e.target.value);
    }
    
    
    
    <input type="text" onChange="this.handleChange" value="111">
    
    handleChange = (e: React.FormEvent<HTMLInputElement>) => {
      ...
    }
    

    小技巧,多个 input,使用同一个函数处理:

    interface ISate {
      age: number;
      name: string;
      [key: string]: number | string;
    }
    
    class Form extends Component<{}, ISate> {
      state = {
        name: '',
        age: 0
      }
      
      handleChange = (e: React.FormEvent<HTMLInputElement>) => {
        const { name, value }: { name: string, value: number | string } = e.currentTarget;
        this.setState({
          [name]: value
        })
      }
    
      render() {
        return (
          <div>
            <input type="text" name="name" value={this.state.name} />
            <input type="text" name="age" value={this.state.age} />
          </div>
        )
      }  
    
    }
    

    6 数组定义

    enum Player {
      One: 1, 
      Two: 2,
    }
    
    interface IState {
      board: Player[]
    }
    
    class Form extends Component<{}, ISate> {
      state = {
        board: [Player.One, Player.Two],
      }
      
    }
    
    

    7 填坑

    7.1 接口不相容,使用 Omit 解决

    Interface 'IAutoCompleteProps' incorrectly extends interface 'IInputProps'.
    Types of property 'onSelect' are incompatible.
    ...

    这个报错的意思为 IAutoCompleteProps 接口错误的继承 IInputPropsIAutoCompleteProps 定义的接口 onSelectIInputPropsonSelect 不相容。

    解决的方案是可以使用 ts 提供的 Omit 方法解决, Omit 的意思为使用我们自定好的接口,如下:

    export interface IAutoCompleteProps extends Omit<IInputProps, 'onSelect'>{
      /** fetchSuggest 事件 */
      fetchSuggest?: (keyword: string) => string[];
      /** onSelect 事件 */
      onSelect?: (item: string) => void;
    }
    

    相关文章

      网友评论

          本文标题:TypeScript(-1):ts + react 常用知识点

          本文链接:https://www.haomeiwen.com/subject/jdaclltx.html