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

TypeScript中如何在类型定义内使用已声明的重载函数?

问题原因

报错'myFunction' refers to a value, but is being used as a type here的核心是:TypeScript中函数声明属于运行时层面的值,不能直接作为类型使用,需要通过typeof关键字提取其类型。而myFunction是带泛型的重载函数,TypeScript不支持直接给泛型函数类型提前绑定泛型参数,因此需要调整类型定义逻辑。

解决方案

方案1:直接对齐重载签名(推荐,易维护)

直接在HoneyState类型中声明和myFunction完全一致的重载签名即可,不需要修改原有函数的重载定义,也不需要合并返回类型:

function myFunction<T, U extends keyof T>(keys: U[]): Pick<T, U>
function myFunction<T, TSelected = unknown>(funcArg: (state: T) => TSelected): TSelected;
// 原有myFunction的运行时实现逻辑保持不变即可

type HoneyState<T> = {
  getValue<U extends keyof T>(keys: U[]): Pick<T, U>
  getValue<TSelected = unknown>(funcArg: (state: T) => TSelected): TSelected;
}

方案2:复用原函数类型避免重复编码

如果你不想重复写重载签名,可以通过泛型工具类型复用原函数的类型定义:

type MyFunction = typeof myFunction;

type BindMyFunctionToState<T> = 
  & (<U extends keyof T>(keys: U[]) => Pick<T, U>)
  & (<TSelected = unknown>(funcArg: (state: T) => TSelected) => TSelected);

type HoneyState<T> = {
  getValue: BindMyFunctionToState<T>
}

补充说明

两种方案都不需要修改原有函数的重载逻辑,你只需要保证myFunction的运行时实现兼容所有重载的入参、出参规则即可,类型定义和运行时实现是完全独立的。


内容的提问来源于stack exchange,提问作者Kody R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 02:45:02