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

Typescript从具有泛型类型的对象索引调用函数

黄涵畅
2023-03-14

我试图在打字稿中使用泛型,这样泛型参数将被用作索引来调用存储在对象中的函数。
我收到的错误是:

[ts]不能调用类型缺少调用签名的表达式。类型'((变量:{插入ID:数字;})=

“QueryInput[T]”类型的参数不能分配给“{insertId:number;”类型的参数

下面是复制该问题的示例代码:

type Query = "insert" | "update" | "delete";

interface QueryInput {
  insert: { insertId: number };
  update: { updateId: number; value: string };
  delete: { deleteId: number };
}

type QueryObject = { [T in Query]: (variable: QueryInput[T]) => string };

const queries: QueryObject = {
  insert: variable => "insert",
  update: ({ updateId, value }) => "update",
  delete: variable => "delete"
};

const getQuery = <T extends Query>(query: T, variables: QueryInput[T]) => {
  return queries[query](variables); // this line throws an error
}

似乎Typescript引擎无法解析函数的正确签名-尽管肯定只有一个可能的签名(从查询[query]返回的签名)
似乎查询变量已正确解析,并具有适当的类型。

共有1个答案

公孙茂学
2023-03-14

如果您想要一个快速的脏解决方案来编译它,

const getQuery = <T extends Query>(query: T, variables: QueryInput[T]) => {
  let v: any = variables;
  return queries[query](v); // this line doesnt throw an error
}

它并不理想,但是getQuery本身似乎永远不会改变。getQuery的用法仍然会按照您想要的方式使用此解决方案,只是它的实现不会。

直到你找到更好的解决方案...

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

  • 现在,当我在地图上迭代时…我能以某种方式获得每个Class1对象的类型(K,V)吗??

  • 如何为动态创建的函数声明泛型类型? 我如何在中使用并传递? < code>useFoo的预期用法

  • 下面是一个常见的 JavaScript 函数,实现从一个对象中选取指定属性,得到它们的属性值: function pluck(o, names) { return names.map(n => o[n]) } 实现这样一个函数的类型定义要满足: 数组参数 names 中的元素,只能是对象 o 身上有的属性。 返回类型取决于参数 o 身上属性值的类型。 我们可以通过索引类型实现这样的类型定义。

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

  • 问题内容: 对于一个抽象类,我想定义一个为子类返回“ this”的方法: 我希望能够执行以下操作: 可以说香蕉面包会抛出一个IllegalArgumentException消息“不是蛋糕!”。 问题答案: 编辑 要求子类以某种方式表现是没有问题的,这超出了静态类型可以检查的范围。我们一直在这样做-一页又一页的普通英语指定您如何编写子类。 提出的另一种具有协变返回类型的解决方案必须做同样的事情-用简