You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript自定义Hook解构重命名遇TS2339错误,求复用方案

解决自定义Hook解构重命名的TS类型错误问题

方案一:使用正确的解构重命名语法

你遇到的TS2339错误,本质是解构时错误地直接用目标变量名作为属性名。正确的解构重命名语法是原属性名: 新变量名,既符合TS类型约束,又能自定义变量名:

// 正确写法:将activeItemsNumber重命名为number1
const { activeItemsNumber: number1 } = useMyState(widgets);
const { activeItemsNumber: number2 } = useMyState(channels);

这种方式无需修改原Hook代码,直接利用ES6解构的重命名特性即可解决问题,是最直接的方案。

方案二:让Hook支持动态属性名(通过泛型)

如果你希望Hook返回的对象属性名本身就是自定义的,可以通过泛型+动态属性改造Hook,让TS能正确推断返回类型:

import { useRef, MutableRefObject } from 'react';

// 定义泛型Hook,接受自定义属性名作为参数
export function useMyState<T extends string>(items: any, propName: T): { [K in T]: MutableRefObject<number> } {
  const activeItemsNumber = useRef(0);
  
  // 这里编写你的业务逻辑,比如根据items更新activeItemsNumber.current
  // some code
  
  // 返回包含自定义属性名的对象
  return {
    [propName]: activeItemsNumber
  } as { [K in T]: MutableRefObject<number> };
}

调用时传入自定义的属性名:

const { number1 } = useMyState(widgets, 'number1');
const { number2 } = useMyState(channels, 'number2');

TS会根据传入的propName自动推断返回对象的属性类型,不会再报错。

方案三:让Hook直接返回Ref值(无需解构)

如果你的Hook仅需要返回这一个Ref值,可以简化返回结构,直接返回Ref对象,调用时可直接自定义变量名:

import { useRef, MutableRefObject } from 'react';

export const useMyState = (items): MutableRefObject<number> => {
  const activeItemsNumber = useRef(0);
  
  // some code
  
  return activeItemsNumber;
};

调用时直接赋值:

const number1 = useMyState(widgets);
const number2 = useMyState(channels);

这种方案最简洁,适合Hook仅返回单一值的场景。

内容的提问来源于stack exchange,提问作者one-hand-octopus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:25:19