【问题标题】:How to recursively replace typescript primitives with a parameterized type如何用参数化类型递归替换打字稿原语
【发布时间】:2021-11-20 03:45:11
【问题描述】:

typeinterface 都可以工作。

interface example {
  s: string;
  o: {
    t: string;
    arrn: number[];
    arr: {
      u: string;
    }[];
};

会变成

interface transformed {
  s: {
    onChange: (v: string) => void;
  };
  o: {
    t: {
      onChange: (v: string) => void;
    };
    arrn: {
      onChange: (v: number) => void;
    }[];
    arr: {
      u: {
        onChange: (v: number) => void;
      };
    }[];
};

这可能吗?

这样做的方向是什么?

【问题讨论】:

    标签: typescript typescript-generics typescript-utility


    【解决方案1】:

    我认为以下类型满足您的描述:

    interface example {
      s: string;
      o: {
        t: string;
        arrn: number[];
        arr: {
          u: string;
        }[];
      };
    }
    
    type ReplacePrimitives<T> = T extends Record<any, any>
      ? { [K in keyof T]: ReplacePrimitives<T[K]> }
      : { onChange: (value: T) => void };
    
    type transformed = ReplacePrimitives<example>;
    

    它递归地将所有原始值替换为您描述的 onChange 对象,从而保留记录和数组结构。

    【讨论】:

    • 哈哈,是的,希望在 SO 上有一些迹象,比如“有人正在回答这个问题”:)
    • 哦,这比我预期的要容易!我忘记了数组和对象都是记录。谢谢 - 我无法正确分配 2 个答案:P
    【解决方案2】:
    type Transform<T> = T extends object
      // T is an object (including an array), so transform each property
      ? {[K in keyof T]: Transform<T[K]>}
      // T is a primitive, so do the transformation
      : {onchange: (v: T) => void};
    
    type transformed = Transform<example>
    

    这也适用于元组和数组:

    // {onchange: (v: string) => void}[]
    type ArrayTest = Transform<string[]>;
    // readonly {onchange: (v: string) => void}[]
    type ReadonlyArrayTest = Transform<readonly string[]>;
    /* [
      {onchange: (v: string) => void},
      {onchange: (v: number) => void},
      ...{onchange: (v: boolean) => void}[],
    ] */
    type TupleTest = Transform<[string, number, ...boolean[]]>;
    

    Playground link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2021-12-15
      相关资源
      最近更新 更多