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

能否无需类型断言将泛型T | undefined推断为Partial<T>?

如何避免默认值设置函数中的类型断言?

当然可以不用as Partial<T>这类断言,通过明确返回值类型的定义,就能让TypeScript自动推导正确的类型,同时满足你的需求——提供默认值的属性保留原类型,未提供的则为原类型| undefined。

改进后的实现

const setDefaults = <T extends object, K extends keyof T>(
  data: T | undefined,
  defaults: Pick<T, K>,
): Pick<T, K> & Partial<Omit<T, K>> => {
  return { ...defaults, ...data };
};

类型说明

  • 返回类型Pick<T, K> & Partial<Omit<T, K>>是核心:
    • Pick<T, K>:保证传入默认值的属性(即K对应的键)类型为原类型(非可选,因为有默认值兜底);
    • Partial<Omit<T, K>>:将未设置默认值的属性(排除K后的剩余键)标记为可选,对应类型自然变成原类型 | undefined。
  • 移除类型断言后,...data在data为undefined时会被扩展运算符自动忽略,TypeScript能正确识别合并后的对象结构,无需额外断言。

验证你的示例

type MyData = {
  id: number,
  roles: Array<string>,
};

let data: MyData | undefined;

const { id, roles } = setDefaults(data, { roles: [] });

console.log(id); // 类型为 number | undefined
console.log(roles); // 类型为 Array<string>

类型推导完全符合你的预期,且代码中没有任何类型断言。如果想让返回类型更直观,还可以封装成工具类型:

type WithDefaults<T extends object, K extends keyof T> = Pick<T, K> & Partial<Omit<T, K>>;

const setDefaults = <T extends object, K extends keyof T>(
  data: T | undefined,
  defaults: Pick<T, K>,
): WithDefaults<T, K> => {
  return { ...defaults, ...data };
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:15:15