browser icon indicating copy to clipboard operation
browser copied to clipboard

type .d.ts

Open Shana-AE opened this issue 9 months ago • 6 comments

定义了一下browser-tool的类型,需要的同志可以自取

declare module 'browser-tool' {

  type UnionToIntersection<U> = (
    U extends any ? (k: U) => void : never
  ) extends (k: infer I) => void ? I : never;

  interface BrowserParser {
    parse(ua: string): {
      browser: string;
      browserVersion: string;
      engine: string;
      isWebview: boolean;
      isRobot: boolean;
    };
    getInfo(): Promise<
      ReturnType<BrowserParser['parse']> & {
        cookieEnabled: boolean;
        userAgent: string;
      }
    >;
  }

  interface SystemParser {
    parse(ua: string): {
      system: string;
      systemVersion: string;
      platform: string;
      architecture: string;
      bitness: number;
    }
    getInfo(): Promise<ReturnType<SystemParser['parse']>>;
  }

  interface DeviceParser {
    parse(ua: string): {
      device: string;
    }
    getInfo(): Promise<ReturnType<DeviceParser['parse']>> & {
      devicePixelRatio: number;
      deviceMemory: number;
    };
  }

  interface GpuParser {
    parse(): Record<string, never>;
    getInfo(): Promise<{
      gpu: string;
      gpuModel: string;
    }>;
  }

  interface NetworkParser {
    parse(): Record<string, never>;
    getInfo(): Promise<{
      network: string;
      isOnline: boolean;
      ip: string;
    }>;
  }

  interface BatteryParser {
    parse(): Record<string, never>;
    getInfo(): Promise<{
      isCharging: boolean;
      battery: string;
    }>;
  }

  interface ScreenParser {
    parse(): Record<string, never>;
    getInfo(): Promise<{
      screenWidth: number;
      screenHeight: number;
      clientWidth: number;
      clientHeight: number;
      screenFPS: number;
      screenColorDepth: number;
      screenPixelDepth: number;
      isTouch: boolean;
    }>
  }

  interface LanguageParser {
    parse(): Record<string, never>;
    getInfo(): Promise<{
      language: string;
    }>
  }

  interface TimezoneParser {
    parse(): Record<string, never>;
    getInfo(): Promise<{
      timezone: string;
    }>
  }

  type InfoParserMap = {
    browser: BrowserParser;
    system: SystemParser;
    device: DeviceParser;
    gpu: GpuParser;
    network: NetworkParser;
    battery: BatteryParser;
    screen: ScreenParser;
    language: LanguageParser;
    timezone: TimezoneParser;
  }

  type FingerprintList = 'webgl' | 'canvas' | 'font' | 'audio' | 'mime';

  interface BrowserTool {
    parse(ua: string): ReturnType<BrowserParser['parse']> & ReturnType<SystemParser['parse']> & ReturnType<DeviceParser['parse']>;
    getInfo(): Promise<UnionToIntersection<{
      [K in keyof InfoParserMap]: Awaited<ReturnType<InfoParserMap[K]['getInfo']>>
    }[keyof InfoParserMap]>>;
    getInfo<T extends (keyof InfoParserMap)[]>(list: [...T]): Promise<UnionToIntersection<{
      [K in T[number]]: Awaited<ReturnType<InfoParserMap[K]['getInfo']>>
    }[T[number]]>>;
    getFingerprint(): Promise<{
      value: string;
    } &{

      [K in FingerprintList]: string;
    }>
    getFingerprint<T extends FingerprintList>(list: T[]): Promise<{
      value: string;
    } &{
      [K in T]: string;
    }>;
    isSupport(name: string, value: string): boolean;
  }

  const browserTool: BrowserTool;

  export default browserTool;
}

Shana-AE avatar Mar 19 '25 06:03 Shana-AE

@mumuy 把TypeScript的类型定义合并到代码里?

q1uxu avatar May 07 '25 07:05 q1uxu

这类型定义,能合并到源码里最好,或者发布到NPM的 @types/browser-tool也行

q1uxu avatar May 07 '25 08:05 q1uxu

@Shana-AE 考虑发布到@types/browser-tool吗?我问了chatGPT,它给了发布步骤 https://chatgpt.com/share/681b143e-82dc-800d-bd4a-4e60b9e42c74

q1uxu avatar May 07 '25 08:05 q1uxu

@Shana-AE 考虑发布到@types/browser-tool吗?我问了chatGPT,它给了发布步骤 https://chatgpt.com/share/681b143e-82dc-800d-bd4a-4e60b9e42c74

@mumuy 交给作者决定吧~

Shana-AE avatar May 08 '25 08:05 Shana-AE

@Shana-AE 考虑发布到@types/browser-tool吗?我问了chatGPT,它给了发布步骤 https://chatgpt.com/share/681b143e-82dc-800d-bd4a-4e60b9e42c74

@mumuy 交给作者决定吧~

作者说过他不使用TypeScript

q1uxu avatar May 09 '25 07:05 q1uxu

@Shana-AE 考虑发布到@types/browser-tool吗?我问了chatGPT,它给了发布步骤 https://chatgpt.com/share/681b143e-82dc-800d-bd4a-4e60b9e42c74

@mumuy 交给作者决定吧~

作者说过他不使用TypeScript

那尊重作者,就这样吧,而且发布到@types需要有维护者,直接添加文件自己修改也方方便

Shana-AE avatar May 14 '25 06:05 Shana-AE