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

多西纳尔

我试图在Typescript中使用泛型,以便将泛型参数用作索引来调用存储在对象中的函数。
我收到的错误是:

[ts]无法调用类型缺少调用签名的表达式。类型'((变量:{insertId:number;})=>字符串)| ((变量:{updateId:数字;值:字符串;})=>字符串)| ((variable:{deleteId:number;})=>字符串)'没有兼容的呼叫签名。[2349]

要么

类型'QueryInput [T]'的参数不能分配给类型'{insertId:number; }&{updateId:number; 值:字符串;}&{deleteId:number; }'。输入'{insertId:number; } | {updateId:number; 值:字符串;} | {deleteId:数字;}'不能分配给类型'{insertId:number; }&{updateId:number; 值:字符串;}&{deleteId:number; }'。输入'{insertId:number; }'不能分配给类型'{insertId:number; }&{updateId:number; 值:字符串;}&{deleteId:number; }'。输入'{insertId:number; }”缺少类型“ {updateId:number; 值:字符串;}':updateId,值类型'QueryInput [T]'不能分配给类型'{insertId:number; }'。输入'{insertId:number; } | {updateId:number; 值:字符串;} | {deleteId:数字;}'不能分配给类型'{insertId:number; }'。类型'{updateId:number;缺少属性'insertId'。值:字符串;}”,但类型为“ {insertId:number; }'。ts(2345)App.tsx(7,13):此处声明为'insertId'。(参数)变量:QueryInput [T]

这是一个复制该问题的示例代码:

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引擎无法解析函数的正确签名-尽管肯定只有1个可能的签名(从返回的那个queries[query])。
似乎queryvariables已正确解决,并具有适当的类型。

精神男人

如果您想要快速的肮脏解决方案进行编译,

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的用法,而无需输入实现。

直到找到更好的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建具有泛型类型的函数

来自分类Dev

我可以告诉TypeScript泛型类型具有构造函数吗?

来自分类Dev

在运行时从对象的字符串名称创建具有泛型类型的类的实例和具有相同泛型类型的调用方法

来自分类Dev

如何处理在Scala中返回具有泛型类型的对象的函数

来自分类Dev

TypeScript泛型:React中具有联合类型的道具

来自分类Dev

Typescript中具有泛型的子类型约束

来自分类Dev

TypeScript泛型:React中具有联合类型的道具

来自分类Dev

具有类型依赖参数的 TypeScript 泛型方法

来自分类Dev

调用具有多个泛型类型的泛型方法,而无需指定每个泛型类型

来自分类Dev

从具有泛型参数的子类方法调用构造函数

来自分类Dev

具有新类型约束的泛型构造函数

来自分类Dev

具有泛型类型的函数中使用的Ordeby(),Where()等

来自分类Dev

具有隐式泛型类型的Scala模拟函数

来自分类Dev

Kotlin - 具有泛型返回类型的抽象函数

来自分类Dev

具有泛型类型的 swift 扩展函数 - isEmpty for FetchedResults

来自分类Dev

TypeScript中具有泛型的递归对象文字

来自分类Dev

通过泛型缩小TypeScript索引类型

来自分类Dev

使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

来自分类Dev

使用泛型类型调用重载函数

来自分类Dev

泛型类型的TypeScript函数重载

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

具有泛型类型的泛型集合生成

来自分类Dev

具有泛型类型的泛型集合生成

来自分类Dev

Typescript-具有通用类型函数的索引签名

来自分类Dev

具有泛型构造函数的泛型类?

来自分类Dev

具有多个特征的泛型类型

来自分类Dev

具有泛型的Scala类型类

来自分类Dev

具有多个泛型类型的ArrayList?

来自分类Dev

具有接口类类型的泛型

Related 相关文章

  1. 1

    创建具有泛型类型的函数

  2. 2

    我可以告诉TypeScript泛型类型具有构造函数吗?

  3. 3

    在运行时从对象的字符串名称创建具有泛型类型的类的实例和具有相同泛型类型的调用方法

  4. 4

    如何处理在Scala中返回具有泛型类型的对象的函数

  5. 5

    TypeScript泛型:React中具有联合类型的道具

  6. 6

    Typescript中具有泛型的子类型约束

  7. 7

    TypeScript泛型:React中具有联合类型的道具

  8. 8

    具有类型依赖参数的 TypeScript 泛型方法

  9. 9

    调用具有多个泛型类型的泛型方法,而无需指定每个泛型类型

  10. 10

    从具有泛型参数的子类方法调用构造函数

  11. 11

    具有新类型约束的泛型构造函数

  12. 12

    具有泛型类型的函数中使用的Ordeby(),Where()等

  13. 13

    具有隐式泛型类型的Scala模拟函数

  14. 14

    Kotlin - 具有泛型返回类型的抽象函数

  15. 15

    具有泛型类型的 swift 扩展函数 - isEmpty for FetchedResults

  16. 16

    TypeScript中具有泛型的递归对象文字

  17. 17

    通过泛型缩小TypeScript索引类型

  18. 18

    使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

  19. 19

    使用泛型类型调用重载函数

  20. 20

    泛型类型的TypeScript函数重载

  21. 21

    为什么在具有可比约束的泛型函数中丢失泛型类型信息?

  22. 22

    具有泛型类型的泛型集合生成

  23. 23

    具有泛型类型的泛型集合生成

  24. 24

    Typescript-具有通用类型函数的索引签名

  25. 25

    具有泛型构造函数的泛型类?

  26. 26

    具有多个特征的泛型类型

  27. 27

    具有泛型的Scala类型类

  28. 28

    具有多个泛型类型的ArrayList?

  29. 29

    具有接口类类型的泛型

热门标签

归档