TypeScript中是否存在代表任意可迭代对象的类型?
问题解答
1. TypeScript对应可遍历/可迭代类型说明
你需要的表示所有可迭代类型的内置类型是Iterable<T>,它匹配所有实现了Symbol.iterator接口的类型,包括数组、Set、Map、字符串、生成器等所有可以用for...of遍历的类型。
如果你是要匹配普通键值对对象+数组,也就是你当前代码里实际处理的两种类型,可以自己定义一个联合类型,也可以用泛型约束实现更严格的类型校验。
2. 补充类型后的完整函数代码
你提供的函数补全类型后可写成如下形式,既保证类型安全,也保留原逻辑的功能:
// 递归类型:自动把对象/数组中所有undefined类型替换为null type UndefinedToNull<T> = T extends undefined ? null : T extends (infer U)[] ? UndefinedToNull<U>[] : T extends object ? { [K in keyof T]: UndefinedToNull<T[K]> } : T; export const objectUndefinedToNull = <T extends object>(obj: T): UndefinedToNull<T> => { const apply = (o: object) => { Object.keys(o).forEach((key) => { const record = o as Record<string, unknown> const value = record[key]; if (value === undefined) { record[key] = null; } if ((value instanceof Array || value instanceof Object) && value !== null) { apply(value); } }); }; apply(obj); return obj as UndefinedToNull<T>; };
3. 代码说明
- 用泛型
T extends object约束入参必须是对象/数组,避免传入基础类型出现非预期错误 - 自定义的
UndefinedToNull递归类型可以自动推导返回值类型,调用函数后拿到的返回值会自动把所有定义为undefined的位置替换为null类型,不需要手动做类型断言 - 原逻辑中的
value || {}会把null值转为空对象做多余处理,因此补充了value !== null的判断,逻辑更严谨。
内容的提问来源于stack exchange,提问作者The.Wolfgang.Grimmer
相关产品推荐
相关产品推荐

