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

如何为将对象null值替换为undefined的函数添加TypeScript类型?

解决TypeScript替换对象null值为undefined的类型错误问题

问题分析

你当前的类型定义存在两个核心问题:

  1. 自定义Return<T>类型中错误使用了T[keyof T],这会把所有属性值的联合类型套用到每个属性上,而非每个key对应的具体类型;
  2. Object.fromEntries的返回类型TypeScript无法自动推断为你的自定义类型,需要显式类型断言。

修正后的代码

// 定义将null替换为undefined的映射类型
type UndefineNull<T> = {
  [K in keyof T]: T[K] extends null ? undefined : T[K];
};

export const undefineNullValues = <T extends object | null | undefined>(
  obj: T
): T extends null | undefined ? {} : UndefineNull<T> => {
  return Object.fromEntries(
    Object.entries(obj ?? {}).map(([key, value]) => {
      return value === null ? [key, undefined] : [key, value];
    })
  ) as T extends null | undefined ? {} : UndefineNull<T>;
};

关键修正点说明

  • 映射类型修正:把原T[keyof T]改为T[K],确保每个属性都使用自身的原始类型进行null到undefined的替换;
  • 泛型约束扩展:将泛型约束改为T extends object | null | undefined,匹配函数中obj ?? {}的处理逻辑;
  • 条件返回类型:通过T extends null | undefined ? {} : UndefineNull<T>处理传入null/undefined时返回空对象的场景;
  • 类型断言:用as断言Object.fromEntries的返回值为目标类型,解决TypeScript的类型推断限制。

测试验证

const demoObj = { name: "Alice", age: null, active: true };
const processedObj = undefineNullValues(demoObj);
// processedObj的类型自动推导为:{ name: string; age: undefined; active: boolean }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:36:29