繁体   English   中英

Typescript:使用泛型类型的键作为函数的参数 object 键

[英]Typescript: Use generic type's keys as function's argument object keys

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

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

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在这里被视为一个值。 有谁知道我做错了什么? 我使用的各种实用程序类型和索引类型似乎无法解决我的问题。 我希望 function 的调用者在尝试传递不具有与实现中定义的类型匹配的所有键的对象时收到警告。

谢谢

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

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中获取更多信息,您也可以反过来拨打 map。 我还发现这更容易理解,但默认情况下不会扩展显示的类型:

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

游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM