我有一个函数,其中泛型类型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] 删除。
我来说两句