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

如何为TypeScript递归包装器函数实现完整类型定义?

TypeScript递归包装器与完整类型定义

递归包装类型定义

首先定义递归类型WrappedType,用来描述输入值经过包装后的最终类型:

type WrappedType<T, Wrapper extends <C>(value: C) => unknown> =
  // 处理原始类型:直接应用包装器
  T extends string | number | bigint | boolean ? ReturnType<(Wrapper extends <C>(v: C) => infer R ? (v: T) => R : never)> :
  // 处理数组:递归包装每个元素
  T extends Array<infer U> ? WrappedType<U, Wrapper>[] :
  // 处理对象:递归包装每个属性
  T extends object ? { [K in keyof T]: WrappedType<T[K], Wrapper> } :
  // 其他类型(undefined、symbol、function等)返回undefined
  undefined;

带类型定义的包装函数实现

基于上述类型,完善wrap函数的类型标注,并添加必要的类型断言适配TypeScript递归类型推导限制:

function wrap<T, Wrapper extends <C>(value: C) => unknown>(
  value: T,
  primitiveWrapper: Wrapper
): WrappedType<T, Wrapper> {
  const type = typeof value;

  switch (type) {
    case "string":
    case "number":
    case "bigint":
    case "boolean":
      return primitiveWrapper(value) as WrappedType<T, Wrapper>;

    case "object":
      if (value === null) return undefined as WrappedType<T, Wrapper>;
      if (Array.isArray(value)) {
        return value.map(v => wrap(v, primitiveWrapper)) as WrappedType<T, Wrapper>;
      } else {
        return Object.fromEntries(
          Object.entries(value).map(([k, v]) => [k, wrap(v, primitiveWrapper)])
        ) as WrappedType<T, Wrapper>;
      }

    default:
      return undefined as WrappedType<T, Wrapper>;
  }
}

示例用法

以下是一个简单的包装器示例,将原始类型包装为包含value属性的对象:

// 定义包装器:把任意原始类型值包装成 { value: 原始值 }
const wrapWithObject = <C>(value: C) => ({ value });

// 测试基本类型
const wrappedString = wrap("hello", wrapWithObject);
// 类型:{ value: string }

// 测试数组
const wrappedArray = wrap([123, "test", true], wrapWithObject);
// 类型:Array<{ value: number } | { value: string } | { value: boolean }>

// 测试嵌套对象
const wrappedNestedObj = wrap(
  {
    user: { name: "Alice", age: 28 },
    tags: ["frontend", "typescript"]
  },
  wrapWithObject
);
// 类型:{
//   user: { name: { value: string }, age: { value: number } },
//   tags: Array<{ value: string }>
// }

关键说明

  • 递归类型WrappedType会自动遍历输入值的所有嵌套层级,确保数组和对象的每个成员都被正确包装
  • 函数泛型Wrapper约束为接受任意原始类型的泛型函数,保证包装器能处理所有符合条件的原始值
  • 添加了null判断(因为typeof null === 'object'),避免空值导致的异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:35:23