首页 > 解决方案 > 打字稿函数定义:返回嵌套对象,其中键从值数组中查找

问题描述

我有一个方法将一个对象作为输入,该对象的值是字符串数组;它返回一个对象,其值是键等于字符串值的对象。例如

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;
    };
}

可以这样做吗?

标签: javascripttypescriptfunctionsignature.d.ts

解决方案


为了允许 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 会将数组的成员缩小到比字符串更具体的类型。


推荐阅读