【问题标题】:Typescript: list of keys into the object with the same keys and values based on key content打字稿:基于键内容的具有相同键和值的对象的键列表
【发布时间】:2021-06-16 16:25:43
【问题描述】:

我们需要键入函数,该函数需要一个键(字符串)列表,并生成具有相同键的对象,当键以? 开头时,值为string | undefined,否则只是string

export function useParams<T extends string>(
  expected: T[]
): { [key in T as NonOptional<T>]: string } {
  // ... our custom implementation
  return null as any;
}

type NonOptional<T extends string> = T extends `?${infer Inner}` ? Inner : T;

// Should produce type { a: string; b: string | undefined }
const result = useParams(['a', '?b']);

但是,我不确定如何输入输出。

【问题讨论】:

    标签: typescript mapped-types


    【解决方案1】:

    你可以写它迭代元组的键:

    export function useParams<T extends readonly string[]>(
      expected: T
    ): { [K in T[number] as NonOptional<K>]: string | OrUndefined<K> } {
      return null as any;
    }
    
    type NonOptional<T extends string> = T extends `?${infer Inner}` ? Inner : T;
    type OrUndefined<T extends string> = T extends `?${string}` ? undefined : never
    
    const result = useParams(['a', '?b'] as const);
    

    playground link


    添加部分以解决 cmets 中描述的问题:

    我很确定开发人员会忘记添加 as const,然后它将停止正常工作。

    要允许传递非只读元组,您可以使用variadic tuple types

    export function useParams<T extends string[]>(
      expected: [...T]
    ): { [K in T[number] as NonOptional<K>]: string | OrUndefined<K> } {
      return null as any;
    }
    
    type NonOptional<T extends string> = T extends `?${infer Inner}` ? Inner : T;
    type OrUndefined<T extends string> = T extends `?${string}` ? undefined : never
    
    const result = useParams(['a', '?b']);
    

    playground link

    【讨论】:

    • 谢谢!看起来不错,但不幸的是,我很确定开发人员会忘记添加as const,然后它将停止正常工作。知道如何在没有as const 的情况下使其工作吗?
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2020-04-20
    • 2019-10-03
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多