zoukankan      html  css  js  c++  java
  • typescript中的泛型的使用

    1、泛型的定义:一种方法使返回值的类型与传入参数的类型是相同的。使用了类型变量,它是一种特殊的变量,只用于表示类型而不是值

    function identity<T>(arg: T): T {
        return arg;
    }

    2、泛型变量

    function loggingIdentity<T>(arg: T[]): T[] {
        console.log(arg.length);  // Array has a .length, so no more error
        return arg;
    }

    3、泛型类型

    let myIdentity: <T>(arg: T) => T = identity;
    let myIdentity: <U>(arg: U) => U = identity;
    let myIdentity: {<T>(arg: T): T} = identity;
    interface GenericIdentityFn {
        <T>(arg: T): T;
    }
    
    function identity<T>(arg: T): T {
        return arg;
    }
    
    let myIdentity: GenericIdentityFn = identity;

     4、在React + ts的项目里使用泛型和Promise

    1、在ts的配置里添加es2015
    2、代码如下
    // hooks -----
    import { useRef, useCallback } from 'react';
    
    function useLockFn<P extends any[] = any[], V extends any = any>(fn: (...args: P) => Promise<V>) {
      const lockRef = useRef(false);
    
      return useCallback(
        async (...args: P) => {
          if (lockRef.current) return;
          lockRef.current = true;
          try {
            const ret = await fn(...args);
            lockRef.current = false;
            return ret;
          } catch (e) {
            lockRef.current = false;
            throw e;
          }
        },
        [fn],
      );
    }
    
    export default useLockFn;
    // 在页面里调用Hooks
    import React, { FC } from 'react';
    import useLockFn from '../hooks/useLockFn';
    // 创建接口类型
    export interface Iprops {
      value: number;
      // 表示undefined
      onIncrement: () => void;
      onDecrement: () => void;
    }
    
    export interface Dprops {
      value: number;
    }
    
    // 使用接口代替PropTypes 进行类型校验
    // const Counter = ({ value }: Iprops) => {
    //   return <p>Clicked: {value} times</p>;
    // };
    const Demo: FC<Dprops> = (props) => {
      const { value, ...restProps } = props;
      // 应该写一个promise的泛型
      // var demo =
      // const demo = new Promise((resolve: () => void, reject) => {
      //   console.log('123');
      // });
      // 自己总结下,在ts中怎么写和使用Promise
      // function red() {
      //   console.log('red');
      // }
      // function green() {
      //   console.log('green');
      // }
      // function yellow() {
      //   console.log('yellow');
      // }
      // function light(time: number, name) {
      //   return new Promise((resolve) => {
      //     setTimeout(() => {
      //       name();
      //       resolve();
      //     }, time);
      //   });
      // }
      // function step() {
      //   Promise.resolve().then(() => {
      //     return light(3000, red);
      //   });
      // }
    
    
      // 直接写会报错,必须符合泛型的数值使用
      function demo(): Promise<any> {
        // return new Promise((resolve) => {
        //   console.log('123');
        // });
        return new Promise((resolve) => {
          setTimeout(() => {
            console.log('123');
            // alert('不可以');
          }, 100);
        });
      }
      // var promise = new Promise(function (reslove, reject) {
      //   setTimeout(
      //     function (res) {
      //       reslove(res);
      //     },
      //     1000,
      //     '成功'
      //   );
      // });
      // promise.then(function (res) {
      //   console.log(res); //'成功'
      // });
      // var demo = () => {
      //   console.log('234');
      // };
    
      useLockFn(demo);
    
      return <div onClick={useLockFn(demo)}>1111</div>;
    };
    
    export default Demo;
  • 相关阅读:
    LocalDateTime和Date使用@JsonFormat显示毫秒时间
    curl查看ip的几种方式
    thinkphp5.1生成缩略图很模糊
    ajax发送时禁用按钮
    thinkphp5 不使用form,用input+ajax异步上传图片
    GOLANG 闭包和普通函数的区别
    GOLANG 匿名函数笔记
    父级自适应自己高度且高度完全一致css
    子元素等高 css
    ios 用jquery为元素标签绑定点击事件时,ios上不执行点击事件
  • 原文地址:https://www.cnblogs.com/Roxxane/p/14486657.html
Copyright © 2011-2022 走看看