能否无需类型断言将泛型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
相关产品推荐
相关产品推荐

