• 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);
        });
    };

    参考

    官网:泛型

  • 相关阅读:
    基于Swoole的HTTP/HTTPS代理
    Java9新特性系列(module&maven&starter)
    Java9新特性系列(module&maven&starter)
    Java9新特性系列(module&maven&starter)
    Java9新特性系列(module&maven&starter)
    RxJava2源码解析(二)
    C#中的委托和事件(续)
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/kunmomo/p/15745484.html
Copyright © 2020-2023  润新知