当前位置: 首页 > 知识库问答 >
问题:

生成函数的TypeScript泛型类型

单于亮
2023-03-14

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

type FooType = {
  username: string;
}

type BarType = {
  age: number;
}

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

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

const generateFunction = <T, S extends keyof DataStore>(slice: S) => {
  type DataSlice = DataStore[S];

  return (selector: (store: DataSlice) => T) => selector(getDataStore()?.[slice]);
}

我如何在use Foo中使用T并传递的生成函数

const useFoo = generateFunction('foo');

< code>useFoo的预期用法

type UserName = string;

const userName = useFoo<UserName>((foo: FooType) => foo.userName);

共有1个答案

黄信厚
2023-03-14

你正在寻找通用的匿名函数(见这个SO回答)。

const generateFunction = <S extends keyof DataStore>(slice: S) => {
  type DataSlice = DataStore[S];

  return <T,>(selector: (store: DataSlice) => T) => selector(getDataStore()?.[slice]);
}

请注意,T泛型现在与返回的函数相关联,而不是的生成函数本身。正如你的问题中所写的,生成函数是一个泛型函数,它接受两个泛型参数TS,这两个参数在调用函数时是已知的。相反,您希望生成函数接受一个调用时已知的泛型参数S,并让它返回一个函数,其中只有在调用返回的函数时才知道一个泛型参数T

 类似资料:
  • (沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢

  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。

  • Spring4包含了对泛型类型解析的主要增强,但当包含bean类的type参数被参数化时,我无法自动生成泛型类型。 我需要跟踪提交给外部服务的作业的状态,并且我想在每个作业启动时为其创建一个条目,并在收到回发时清除或更新它。我通常会尝试将持久性策略与服务接口分开,因此我有一个接口,一个Spring数据Mongo类。由于作业可能会在外部服务有机会为其分配ID(例如HTTP 502)之前失败,因此我需

  • 我试图在打字稿中使用泛型,这样泛型参数将被用作索引来调用存储在对象中的函数。 我收到的错误是: [ts]不能调用类型缺少调用签名的表达式。类型'((变量:{插入ID:数字;})= 或 “QueryInput[T]”类型的参数不能分配给“{insertId:number;”类型的参数 下面是复制该问题的示例代码: 似乎Typescript引擎无法解析函数的正确签名-尽管肯定只有一个可能的签名(从返回

  • 我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。