首页 > 解决方案 > 递归克隆具有非对象值作为字符串的类型

问题描述

说我有这种类型:

{
  a: number;
  b?: string;
  c: null | {
    a1: boolean;
    a2: {
      b1: number;
    }
  }
}

我想从中创建一个具有完全相同结构的类型,但所有值(或叶子)都被替换为字符串,如下所示:

{
  a: string;
  b?: string;
  c: null | {
    a1: string;
    a2: {
      b1: string;
    }
  }
}

这甚至可能吗?此外,是否可以创建它的部分类型,其中并非所有键都是必需的(我知道Partial存在)。

标签: typescript

解决方案


您可以结合使用条件类型和递归类型来做到这一点:

type Stringify<T> = { [key in keyof T]: T[key] extends object | null ? Stringify<T[key]> : string }

正在使用:

interface Thing {
  a: number;
  b?: string;
  c: null | {
    a1: boolean;
    a2: {
      b1: number;
    }
  }
}

const t: Stringify<Thing> = {
  a: "foo",
  b: "bar",
  c: {
    a1: "baz",
    a2: {
      b1: "qux",
    },
  },
};

操场


推荐阅读