zoukankan      html  css  js  c++  java
  • TypeScript学习(十二)泛型

    总结

    泛型就是广泛的类型(任意类型),泛型变量T,可以是其他的名字,例如U、M等,仅代表类型

    例如泛型函数,可以在调用的时候传入泛型参数决定类型,相比any会有更精确的含义表达

    实战

    // 例1
    // 节流
    // 类型不确定
    export function throttle<T extends any[]>(
        // 类型不确定
        this: any,
        fn: (...arg: T) => void,
        delay: number
    ): (...arg: T) => void {
        let timer: number | null = null;
        const that = this;
        return (...args: T): void => {
            if (!timer) {
                timer = setTimeout(() => {
                    fn.apply(that, args);
                    timer = null;
                }, delay);
            }
        };
    }
    
    // 例2
    export type IResponse<T> = {
        code: number;
        message: string;
        data: T;
    };
    
    export const request = async <T>(options: IRequest): Promise<IResponse<T>> => {
        const { header: originHeader = {}, url: _url, method = 'POST' } = options;
        const hasHost = _url.startsWith('http');
        let httpHost = defaultConfig.host;
        if(options.origin && host[options.origin]) { // 如果设置了自定义域名,则使用这个
            httpHost = host[options.origin];
        }
        const url = hasHost ? _url : httpHost + _url;
    
        return new Promise((resolve, reject) => {
            const originData = options.data;
            options.data = {
                ...originData,
                eOpenId: Cookie.get('eOpenId'),
            };
    
            const requestParam: any = {
                ...options,
                url: url,
                method,
                header: {
                    ...defaultConfig.header,
                    ...originHeader,
                    // #ifdef MP-WEIXIN
                    cookie: Cookie.toCookieString(),
                    // #endif
                },
                // eslint-disable-next-line @typescript-eslint/no-explicit-any
                // 类型不确定
                success: (wrapRes: any) => {
                    console.log("接口请求",url);
                    console.log("request resp:",wrapRes);
                    if (wrapRes.errMsg !== 'request:ok') {
                        debug.error('服务器异常');
                        reportMonitor('0', 1); // 服务器异常
                        reject({
                            code: wrapRes.statusCode,
                            message: wrapRes.errMsg,
                        });
                        return;
                    }
                    let ret = wrapRes.data as IResponse<T>;
                    debug.info('[request]', options.url, originData, ret.data);
                    if (typeof ret !== 'object') {
                        ret = {
                            data: ret as any,
                        } as IResponse<T>;
                    }
                    const tempRes: any = ret;
                    ret.data = ret.data || {...tempRes};
                    // eslint-disable-next-line no-undefined
                    ret.code = ret.code !== undefined ?  ret.code : wrapRes.statusCode;
                    // #ifdef MP-WEIXIN
                    if (ret.code === 500 && ret.message === '用户身份校验失败') {
                        rediretcToLogin('/pages/index/index', {}, true);
                        reject(ret);
                        return;
                    }
                    // #endif
                    if (ret.code > 0 && ret.code < 1000 && ret.code !== 200) {
                        debug.error('接口业务异常:', options.url, originData, ret);
                        reportMonitor('1', 1); // 接口业务异常
                        reject(ret);
                        return;
                    }
                    resolve(ret);
                },
                // eslint-disable-next-line @typescript-eslint/no-explicit-any
                // 类型不确定
                fail: (e: any) => {
                    reject(e);
                },
            };
    
            if(options.origin !== 'GAMECLOUND_HOST') {
                requestParam.withCredentials = true;
            }
    
            uni.request(requestParam);
        });
    };

    参考

    官网:泛型

  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/kunmomo/p/15745484.html
Copyright © 2011-2022 走看看