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

如何为动态创建的TypeScript函数声明泛型?并在useFoo中使用泛型T

问题解答

问题1:如何为动态创建的函数声明泛型类型?

原代码中generateFunction的泛型T被定义在外层函数,导致调用generateFunction时就需要指定T,这不符合动态创建函数的需求——我们希望返回的函数(比如useFoo)自己能独立接收泛型参数。

解决方法是将泛型T从外层函数移到返回的内层函数上,让返回的函数拥有自主的泛型能力:

type FooType = {
  username: string;
}

type BarType = {
  age: number;
}

interface DataStore {
  foo: FooType;
  bar: BarType;
}

const getDataStore = () => ({
  foo: { username: 'Tera' },
  bar: { age: 24 },
})

// 仅在外层声明切片类型的泛型S,T交给返回的函数处理
const generateFunction = <S extends keyof DataStore>(slice: S) => {
  type DataSlice = DataStore[S];
  // 内层函数声明泛型T,对应selector的返回值类型
  return <T>(selector: (store: DataSlice) => T) => selector(getDataStore()?.[slice]);
}

问题2:如何在useFoo中使用泛型T,并正确调用generateFunction?

经过上面的调整,调用generateFunction('foo')得到的useFoo本身就是一个带泛型的函数,直接按你期望的方式使用即可:

// 生成针对foo切片的useFoo函数
const useFoo = generateFunction('foo');

// 按需求指定泛型T并传入selector
type UserName = string;
const userName = useFoo<UserName>((foo: FooType) => foo.username);

甚至TypeScript可以自动推导泛型T,无需显式指定:

// TS会根据selector的返回值自动推导T为string,无需显式<UserName>
const userName = useFoo((foo: FooType) => foo.username);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:05:25