能否不修改函数,仅传入第一个泛型参数并自动推断第二个?
泛型函数省略部分类型参数的实现方案
问题背景
我定义了一个用于返回全局对象属性的泛型函数,代码如下:
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
相关产品推荐
相关产品推荐

