javascript - typescript 函数定义: return nested object with keys looked-up from value array

标签 javascript typescript function signature .d.ts

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

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/

相关文章:

javascript - 在 map typescript 中添加额外的属性类型

javascript - js - 传递和返回多个值

javascript - 在 javascript 中链接回调并保留 'this'

c - 不显示计算结果的函数

javascript - 带有 eval() 的 Javascript 模块;

javascript - 当数据设置为 true 时,为什么我的 bulma 模态不显示? (Vue.js)

javascript - 如何在 chrome 中一次打开多个选项卡?

javascript - Array.reduce如何将函数作为函数组合中的参数?

javascript - Angular 自定义空闲计时器

javascript - 使用 RxJS/TypeScript/JavaScript 将行转换为列