javascript - 打字稿函数定义:返回嵌套对象,其中键从值数组中查找
问题描述
我有一个方法将一个对象作为输入,该对象的值是字符串数组;它返回一个对象,其值是键等于字符串值的对象。例如
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
是 not string[]
but K[]
,这意味着 TS 会将数组的成员缩小到比字符串更具体的类型。
推荐阅读
- android - Android 应用程序对 SD 卡的读取权限停止在特定平板电脑 (Samsung T290) 上使用软件更新
- c# - 隐藏前台通知
- c - 如何使用C语言检查一个数字是否在矩阵中重复?
- enterprise-architect - 如何选择对序列图消息的操作?
- c# - 如何在 C# 的 switch 语句中使用 .Contains()?
- c# - Microsoft.Office.Interop.Outlook --> 800700c1 不是有效的 Win32 应用程序
- python - 将对象附加到列表
- sql - 优化多对多sql查询
- mysql - mySQL - 列如何对 NULL 说 YES 并且还有另一个 DEFAULT?
- java - Android - onRequestPermissionsResult() 已弃用。有没有其他选择?