首页 > 解决方案 > 如何用参数化类型递归替换打字稿原语

问题描述

type或者interface两者都可以工作。

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

这可能吗?

做这样的事情的方向是什么?

标签: typescripttypescript-genericstypescript-utility

解决方案


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

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,留下记录和数组结构。


推荐阅读