Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
T treasure
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 13
    • Issues 13
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • External wiki
    • External wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • FE
  • treasure
  • Issues
  • #240

Closed
Open
Created Jun 14, 2024 by liuyajun@liuyajunMaintainer

★ React 项目,使用 useMethods 自动提示内部函数的名称、参数类型和返回值类型

效果

image

  • 自动提示内部函数的名称、参数类型和返回值类型
  • 使用 methods 不存在的函数会报错提示
  • 提示错误入参和返回值

函数声明

useMethods 新的函数声明修改为:

export function useMethods<T extends Record<string, (...args: any[]) => any>>(methods: T): { [K in keyof T]: (...args: Parameters<T[K]>) => ReturnType<T[K]> };

示例

const methods = useMethods({
  /** 获取暗文 */
  getPlaceholder(val: string) {
    return '请输入' + val;
  },
  /**
   * 获取暗文
   * @description
   * @param val 追加暗文
   * @return
   * @demo
   */
  getPlaceholder2(val: string) {
    return '请输入' + val;
  }
});

覆写 @lhb/hook 内的函数声明

因为 @lhb/hook 涉及项目较多,如果更新,项目内未正确使用 methods 的地方会有较多报错提示(如 调用 methods 内不存在的函数、入参错误等),所以暂不对其修改,采用单个项目内覆写的方式进行。

types/js-lib.d.ts 内追加

//... 

import * as originalLhbHook from '@lhb/hook';

// 覆写 @lhb/hook 内的 useMethods,使其能自动提示内部函数的名称、参数类型和返回值类型
declare module '@lhb/hook' {
  export type LhbHook = originalLhbHook.LhbRegexp; // 因为 `@lhb/hook` 内 `namespace lhbRegexp` 所以这里用 `LhbRegexp`,实际应该改为 `LhbHook`

  /**
   * 升级版 useCallback,满足绝大部分函数构建场景。解决 useCallback 多次声明函数导致的性能问题
   * warning: 不能替代useCallback 在 缓存初始值的场景
   * @description 覆写了 node_modules/@lhb/hook/index.d.ts 内的 useMethods 函数声明
   * @param  {any} methods 需要被优化的方法集群
   * @return {any} 新对象
   * @example
    const { handleChange, handleChange2 } = useMethods({
      handleChange() {
        setPage(1);
      },
      handleChange2() {
        this.handleChange();
      }
    })
   */
  export function useMethods<T extends Record<string, (...args: any[]) => any>>(methods: T): { [K in keyof T]: (...args: Parameters<T[K]>) => ReturnType<T[K]> };

}

顺带一提,@lhb/hook 内 namespace lhbRegexp 应该改为 namespace LhbHook。

Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking