You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typescript如何实现递归映射类型将所有字段转为string类型

实现全字段转string的TypeScript递归映射类型

正确工具类型代码

// 定义不需要递归解析的内置/原始类型,可根据业务需求扩展
type PrimitiveOrBuiltIn = string | number | boolean | symbol | bigint | null | undefined | Date | RegExp | Function;

type MakeAllFieldsString<T> = 
  // 处理数组场景:递归解析元素类型,返回对应数组类型
  T extends Array<infer ItemType> ? MakeAllFieldsString<ItemType>[]
  // 非数组且属于不需要递归的类型,直接返回string
  : T extends PrimitiveOrBuiltIn ? string
  // 普通自定义对象,递归处理每一个属性
  : { [Key in keyof T]: MakeAllFieldsString<T[Key]> };

逻辑说明

  • 优先判断是否为数组类型,通过infer提取数组元素类型后递归处理,保证任意层级的数组都能正确转换为string数组
  • 过滤不需要递归的内置/原始类型,避免把Date、RegExp等对象的内置属性展开转换
  • 对普通自定义对象遍历所有键,递归调用自身处理每个属性值,保证任意层级的嵌套结构都能保持原键结构,值全部替换为string

原写法错误点

  1. 未处理数组场景,遇到数组类型无法生成string[]结构
  2. 错误使用typeof T[Key],T本身是类型,直接引用T[Key]即可
  3. 未区分普通对象和内置对象,会错误展开Date等类型的内置属性
  4. 嵌套处理调用的是仅支持单层的JsonObject,没有递归调用自身,无法支持多层嵌套

验证示例

用你提供的源类型测试:

type MySourceType = {
  field1 :string,
  field2: number,
  field3: number[],
  field4: Date, 
  field5: {
    nestedField1: number,
    nestedField2: number[],
    nestedField3: Date,
  }
}

// 转换后得到的类型完全符合预期
type MyDestinationType = MakeAllFieldsString<MySourceType>;

转换后的MyDestinationType结构如下,和需求完全匹配:

type MyDestinationType = {
    field1 :string,
    field2: string,
    field3: string[],
    field4: string, 
    field5: {
      nestedField1: string,
      nestedField2: string[],
      nestedField3: string,
    }
}

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:36:07