请求实现TypeScript类型与值双层面的字段转换函数
解决方案
1. 实现 convertFieldsToBigInt 函数
通过泛型约束确保类型安全,同时完成值转换:
type a = { f1: string; f2: string; f3: number; f4: number; }; function convertFieldsToBigInt<T extends object, K extends keyof T>( obj: T, fields: K[] ): Omit<T, K> & { [P in K]: bigint } { // 复制原对象,避免修改原数据 const result = { ...obj }; fields.forEach(field => { // 对指定字段应用BigInt转换 result[field] = BigInt(result[field]) as typeof result[field]; }); return result as Omit<T, K> & { [P in K]: bigint }; } // 使用示例 const obj: a = { f1: "123", f2: "abc", f3: 456, f4: 789 }; const b = convertFieldsToBigInt(obj, ['f1', 'f3']); // b的类型自动推导为:{ f1: bigint; f2: string; f3: bigint; f4: number; }
类型约束说明:
T extends object:限制输入的obj为任意对象类型K extends keyof T:确保fields数组中的元素都是obj的合法键,避免传入不存在的字段- 返回值类型
Omit<T, K> & { [P in K]: bigint }:保留原对象未指定字段的类型,将指定字段的类型替换为bigint
2. 实现通用转换函数 convertFields
支持自定义转换逻辑,类型自动适配转换函数的输入输出:
function convertFields< T extends object, K extends keyof T, A, B >( obj: T & { [P in K]: A }, // 确保指定字段的类型符合转换函数的输入要求 fields: K[], converter: (value: A) => B ): Omit<T, K> & { [P in K]: B } { const result = { ...obj }; fields.forEach(field => { result[field] = converter(result[field]) as typeof result[field]; }); return result as Omit<T, K> & { [P in K]: B }; }
类型约束说明:
A:转换函数的输入类型,约束原对象指定字段的类型必须与A兼容B:转换函数的输出类型,转换后指定字段的类型会替换为BT & { [P in K]: A }:强制原对象的指定字段类型匹配转换函数的输入,避免类型不兼容的错误
3. 基于通用函数实现 convertFieldsToBigInt
直接复用通用函数,传入BigInt作为转换逻辑即可:
function convertFieldsToBigInt<T extends object, K extends keyof T>( obj: T, fields: K[] ): Omit<T, K> & { [P in K]: bigint } { return convertFields(obj, fields, BigInt); } // 使用示例与效果完全一致 const obj: a = { f1: "123", f2: "abc", f3: 456, f4: 789 }; const b = convertFieldsToBigInt(obj, ['f1', 'f3']);
说明:
BigInt的类型签名为(value: number | string | bigint | boolean | ...) => bigint,TypeScript会自动推断A为原字段类型、B为bigint,保证类型安全的同时无需额外手动指定泛型参数。
内容的提问来源于stack exchange,提问作者A Question Asker
相关产品推荐
相关产品推荐

