我有一个方法,它接受一个对象作为输入,该对象的值是字符串数组;它返回一个对象,其值是键等于字符串值的对象。例如
myFunction({foo: ['a', 'b']}) // ==> {foo: {a: Widget, b: Widget}}
我正在尝试定义此函数的签名。我最好的尝试是:
declare function myFunction
<Q extends string[], T extends {[key: string]: Q}>
(keys: T) : {[key1 in keyof T]: {[key2 in T[key1][number]]: Widget}}
这几乎有效,除了无法推断嵌套对象的键名称。第一个示例返回:
{
foo: {
[x: string]: Widget;
};
}
而我希望它返回
{
foo: {
a: Widget;
b: Widget;
};
}
可以吗?
最佳答案
为了让 TS 修复推理,我们需要为数组键成员添加额外的泛型类型:
declare function myFunction
<Q extends K[], T extends {[key: string]: Q}, K extends string>
(keys: T): { [key1 in keyof T]: { [key2 in T[key1][number]]: Widget } }
注意Q extends K[]
,我们现在说Q
不是string[]
而是K[ ]
,这意味着 TS 会将数组成员缩小为比字符串更具体的类型。
关于javascript - typescript 函数定义: return nested object with keys looked-up from value array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60034927/