如何为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
相关产品推荐
相关产品推荐

