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

配置TypeScript从同文件特殊函数名自动推断泛型

能否通过TypeScript全局配置让getStuff自动推断同文件loadStuff的返回类型?

结论

无法直接通过TypeScript的全局配置(如tsconfig.json)实现,但可以通过自定义类型声明达到无需手动指定泛型的效果,完全匹配你描述的需求。

为什么全局配置做不到

TypeScript的tsconfig.json仅负责静态编译规则(如目标版本、路径映射、严格模式等),没有提供动态关联模块内特定名称函数返回类型的配置项。这类依赖模块上下文的类型推断逻辑,必须通过类型系统的声明能力实现。

可行的实现方案

通过创建全局类型声明文件,覆盖getStuff的类型定义,让它自动捕获当前模块中顶层loadStuff函数的返回类型:

1. 创建全局类型声明文件

在项目根目录新建global.d.ts,写入以下内容:

declare global {
  // 泛型默认值自动推导当前模块中loadStuff的返回类型,不存在则为unknown
  function getStuff<T = typeof loadStuff extends (...args: any[]) => infer R ? R : unknown>(): T;
}

export {};

2. 在模块中使用

当模块存在顶层loadStuff函数时,getStuff()会自动推断类型:

// demo.ts
function loadStuff() {
  return { a: 1, b: 2 };
}

const stuff = getStuff();
// stuff 自动获得类型 { a: number; b: number }
console.log(stuff.a); // 有类型提示
stuff.c = 3; // TypeScript会报错(不存在属性c)

如果模块中没有loadStuff,getStuff()的类型会默认是unknown,此时仍可手动指定泛型:

// no-load.ts
const stuff = getStuff<{ x: string }>();
// stuff 类型为 { x: string }

关键原理

  • 利用TypeScript的条件类型typeof loadStuff extends (...args: any[]) => infer R ? R : unknown,动态提取当前模块中loadStuff的返回类型。
  • 通过declare global覆盖全局的getStuff类型声明,让所有模块生效。

内容的提问来源于stack exchange,提问作者davnicwil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:40:28