【问题标题】:Typescript converting nested array into type打字稿将嵌套数组转换为类型
【发布时间】:2022-10-14 00:26:04
【问题描述】:

这似乎很基本,但我没有找到答案。

我想调用这样的函数:

const result = myFunction({
  'keyA': [ 'arrayA1', 'arrayA2' ],
  'keyB': [ 'arrayB1', 'arrayB2' ],
});

我希望结果是键/值记录,其中键限制为keyA 和keyB,值也是键/值记录,键为arrayA1、arrayA2 等:

result = {
  keyA: {
    arrayA1: 'example',
    arrayA2: 'example',
   },
   keyB: {
     arrayB1: 'example',
     arrayB2: 'example',
   }
 }

我正在努力想出一个通用函数签名,它将获取参数中的键和数组项并将它们转换为嵌套对象键。

function myFunction<
  T extends { [K in keyof T]: string[] },
  S extends keyof T,
  O extends T[K] // ???
  //O extends { InstanceType<T[K]> } // nope
  //O extends { [K in keyof T]: { [K2 in keyof T[K]]: K2 } } // very confused
>(structure: T): Record<S, Record<O, string>> { ... }

我似乎无法弄清楚如何提取嵌套字符串数组,并将其转换为仅将这些值指定为允许字符串的类型。我错过了什么?

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    您的函数只需要两种通用类型:

    function myFunction<
      T extends Record<string, S[]>,
      S extends string
    >(structure: T): { 
        [K in keyof T]: {
            [K2 in T[K][number]]: string
        }
    } { return null! }
    

    T 将保存传递的structure 并被限制为具有字符串键的对象,其中值为S-arrays。 S 被限制为 string。我们需要S 来将数组中strings 的类型缩小为字符串文字。

    返回类型由两个嵌套的映射类型组成。第一个映射T 的键,而第二个映射T[K] 的元素。

    const result = myFunction({
      'keyA': [ 'arrayA1', 'arrayA2' ],
      'keyB': [ 'arrayB1', 'arrayB2' ],
    });
    
    // const result: {
    //     keyA: {
    //         arrayA1: string;
    //         arrayA2: string;
    //     };
    //     keyB: {
    //         arrayB1: string;
    //         arrayB2: string;
    //     };
    // }
    

    Playground

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多