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

能否不修改函数,仅传入第一个泛型参数并自动推断第二个?

泛型函数省略部分类型参数的实现方案

问题背景

我定义了一个用于返回全局对象属性的泛型函数,代码如下:

type Store = {
  "first": number;
  "second": boolean;
  "third": string;
}

declare function namespaced<S extends Record<string, any>, N extends keyof S>(namespace: N): S[N];

原本调用时需要传入两个泛型参数:let p = namespaced<Store, "first">("first");。由于namespace参数类型为keyof S,我尝试省略第二个类型参数,改为let p = namespaced<Store>("first");,但报错:Expected 2 type arguments, but got 1.(2558)。需要在不修改该函数的前提下实现此需求。

可行方案

方案1:参数类型断言

直接给传入的namespace参数添加类型断言,让TypeScript自动推导第二个泛型参数:

let p = namespaced<Store>("first" as keyof Store);

方案2:封装辅助函数

创建一个预先绑定Store类型的辅助函数,后续调用时无需重复指定泛型:

const storeNamespaced = (namespace: keyof Store) => namespaced<Store, typeof namespace>(namespace);
let p = storeNamespaced("first");

方案3:借助类型工具构造适配函数

利用TypeScript内置的类型工具,构造适配Store类型的函数类型:

type StoreNamespacedFn = (namespace: keyof Store) => ReturnType<typeof namespaced<Store, keyof Store>>;
const storeNamespaced: StoreNamespacedFn = namespaced;
let p = storeNamespaced("first");

以上三种方案均无需修改原namespaced函数的定义,即可实现只传入第一个泛型参数的调用效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:05:27