打字稿:使用泛型类型的键作为函数的参数对象键

杜德瓦德

我有一个函数,其中泛型类型T(这是函数的返回类型)是一个带有类型键和类型string值的字典unknown(因为它们可以是任何东西)。我希望这个函数的唯一参数是一个对象,其键必须与泛型类型的键匹配T本质上,这是一个函数,它在一些转换工作后将对象的键/值对映射到一组不同的值。

我想使用以下(注意函数参数中的索引类型)

export function convert<T extends Record<string, unknown>, S extends keyof any>(items: {
  [key: keyof typeof T]: string
}): T {
  //...do stuff
  return someObj as T;
}

这里重要的是keyof typeof T这不起作用,因为我收到错误:

TS2693: 'T' only refers to a type, but is being used as a value here.

我不确定如何解决这个问题,或者为什么T在这里被认为是一个值。有谁知道我做错了什么?我使用的各种实用程序类型和索引类型似乎无法解决我的问题。我希望函数的调用者在尝试传递不具有与类型匹配的所有键的对象时得到警告,一旦它在实现中定义。

谢谢

提香·切尔尼科娃-德拉戈米尔

您的语法有点错误,映射类型是您想要的而不是索引签名:

export function convert<T extends Record<string, unknown>>(items: {
  [key in keyof T]: string
}): T {
  //...do stuff
  return items as T;
}

游乐场链接

您还可以使用该Record类型而不是自定义映射类型:

export function convert<T extends Record<string, unknown>>(items: Record<keyof T, string>): T {
  //...do stuff
  return items as T;
}

游乐场链接

如果您需要从items. 另外我发现这更容易理解,但默认情况下不展开显示的类型:

export function convert<T extends Record<string, string>>(items: T): Record<keyof T, unknown> {
  //...do stuff
  return items;
}

游乐场链接

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

打字稿:枚举泛型类型作为函数的参数

打字稿:枚举键作为函数的参数

打字稿:如何使用通用参数作为对象键

泛型类型获取枚举键作为打字稿中的联合字符串?

联合类型的部分键作为打字稿中对象的键

在 TypeScript 中使用多个泛型参数作为对象键

通过泛型检索函数类型时,为什么打字稿期望'从不'作为函数参数?

打字稿泛型:给定键K和对象T,限制T [K]的类型

打字稿:从具有泛型的对象获取键映射

打字稿:限制可以通过泛型和特定函数的索引访问类型传递的键的数量

基于泛型类型的打字稿默认函数参数

打字稿:分别检查任何接口属性的键和类型组合作为函数参数

获取已键入对象的键作为打字稿中的类型

打字稿:将函数的参数约束为与特定类型的值关联的对象的键

基于以枚举为键的类型的打字稿函数参数

使用打字稿中类型对象的键推断类型

如何使用枚举作为打字稿中的索引键类型?

使用枚举作为打字稿中的受限键类型

打字稿:使用符号作为键破坏对象

重命名打字稿对象类型的键

TypeScript泛型:从函数参数推断键值返回类型的键

打字稿如何将属性声明为其类的泛型参数 T 的键列表?

打字稿:如何从返回函数的输入参数推断高阶函数中的泛型类型

使用打字稿过滤对象键

以泛型类型作为键/值的Java泛型映射

打字稿:泛型接口、接口函数和类类型参数

使用其他参数作为键的函数中的类型检查对象参数

如何在打字稿中使用泛型参数作为选项

对象的类型为“未知”打字稿泛型