TypeScript中如何将对象指定Date类型字段转换为数字时间戳
报错原因
你当前的写法TS只会默认返回和入参target完全一致的T类型,但你实际修改了指定字段的类型从Date转为number,类型不匹配自然会抛出赋值错误。
正确实现方案
我们需要通过TS类型体操主动定义返回值类型:将传入的keys数组对应的字段类型替换为number,其余字段保持原类型即可,完整代码如下:
// 泛型U提取为传入keys的联合类型,方便做类型映射 function objectDateToStamp< T extends Record<string, unknown>, U extends keyof T >(target: T, keys: U[]): Omit<T, U> & Record<U, number> { const obj = { ...target }; keys.forEach((key) => { const value = obj[key]; if (value instanceof Date) { // 这里做两层断言即可解决赋值类型错误 obj[key] = value.getTime() as unknown as T[U]; } }); // 最终返回值断言为我们构造的转换后类型 return obj as Omit<T, U> & Record<U, number>; }
效果验证
const formData = { username: "tom", startDate: new Date(), endDate: new Date(), } // 转换后formData的类型会自动推导为: // { username: string, startDate: number, endDate: number } const convertedFormData = objectDateToStamp(formData, ["startDate", "endDate"]);
额外注意
你示例代码中出现了endtDate和endDate的拼写不一致问题,实际使用时注意修正即可。
内容的提问来源于stack exchange,提问作者胡泽栋
相关产品推荐
相关产品推荐

