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

如何将任意TypeScript类型转换为字符串?

如何将任意TypeScript类型转换为字符串?

我想把任意给定的TypeScript类型转换成字符串形式,自己写了一段代码,但覆盖不了很多场景。这个问题解决起来难度不小,不想重复造轮子,想问有没有成熟的解决方案?

type UnionToIntersection<U> = (U extends any ? (arg0: U) => void : never) extends (
  arg0: infer I,
) => void
  ? I
  : never

type LastOf<T> = UnionToIntersection<T extends any ? () => T : never> extends () => infer R
  ? R
  : never

type UnionToTuple<
  T,
  L = LastOf<T>,
  Res = [T] extends [never] ? [] : [...UnionToTuple<Exclude<T, L>>, L],
> = Res

type ConvertAnyTypeToAString<T> = T extends
  | string
  | number
  | boolean
  | bigint
  | undefined
  | null
  ? `${T}`
  : T extends symbol
  ? 'symbol'
  : T extends Function
  ? 'function'
  : T extends Date
  ? 'Date'
  : T extends Error
  ? 'Error'
  : T extends RegExp
  ? 'RegExp'
  : T extends Map<infer K, infer V>
  ? `Map<${ConvertAnyTypeToAString<K>},${ConvertAnyTypeToAString<V>}>`
  : T extends WeakMap<infer K, infer V>
  ? `WeakMap<${ConvertAnyTypeToAString<K>},${ConvertAnyTypeToAString<V>}>`
  : T extends Set<infer K>
  ? `Set<${ConvertAnyTypeToAString<K>}>`
  : T extends WeakSet<infer K>
  ? `WeakSet<${ConvertAnyTypeToAString<K>}>`
  : T extends Promise<infer K>
  ? `Promise<${ConvertAnyTypeToAString<K>}>`
  : T extends object
  ? ObjectToString<T>
  : 'not handled'

export type ObjectToString<
  T extends object,
  RemainingKeys extends (keyof any)[] = UnionToTuple<keyof T> extends (keyof any)[]
    ? UnionToTuple<keyof T>
    : never,
  Separator extends string = ',',
  Result extends string = '',
> = RemainingKeys extends [infer H extends keyof T, ...infer Rest extends (keyof any)[]]
  ? ObjectToString<
      T,
      Rest,
      Separator,
      '' extends Result
        ? `{${ConvertAnyTypeToAString<H>}:${ConvertAnyTypeToAString<T[H]>}`
        : `${Result}${Separator}${ConvertAnyTypeToAString<H>}:${ConvertAnyTypeToAString<T[H]>}`
    >
  : `${Result}}`

const sym1 = Symbol('hello')

type U1 = ObjectToString<{ a: 1; b: 2; c: 3; 1: 2, [sym1]:'A' }>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:34:57