如何用TypeScript优雅转换对象:将数字字符串属性转为数字类型
优雅转换对象到TypeScript类实例的几种方式
绝对有不少清爽又优雅的方案来处理这个转换需求,我给你列几个常用且易维护的做法:
1. 给类添加静态工厂方法(最推荐)
把转换逻辑直接封装在params类内部,让代码更内聚,后续复用也方便:
class params { number1: number; number2: number; string1: string; // 静态方法专门处理原始对象到类实例的转换 static from(raw: { number1: string; number2: string; string1: string }): params { const instance = new params(); // 字符串转数字,这里可以按需加NaN校验(比如抛错或设默认值) instance.number1 = parseInt(raw.number1, 10); instance.number2 = parseInt(raw.number2, 10); instance.string1 = raw.string1; return instance; } } // 使用示例 const x = { number1: '1', number2: '2', string1: 'one' }; const myParams = params.from(x);
如果觉得parseInt不够灵活,也可以用Number(raw.number1),记得根据实际场景处理非数字字符串的情况就行。
2. 独立转换函数(不修改原类时用)
如果不想改动params类的结构,写一个纯函数来处理转换也很干净:
class params { number1: number; number2: number; string1: string; } function convertToParams(raw: typeof x): params { return { number1: Number(raw.number1), number2: Number(raw.number2), string1: raw.string1 } as params; } // 使用示例 const myParams = convertToParams(x);
这里用as params做类型断言,因为我们明确知道转换后的结构完全符合类的类型定义(TypeScript里类本身也是一种类型)。
3. 通用转换工具(适合多场景复用)
如果项目里有很多类似的字符串转数字的转换需求,可以写一个更通用的工具函数,结合映射类型来扩展:
type RawParams = typeof x; // 定义和params类对齐的目标类型 type TypedParams = { [K in keyof RawParams]: K extends 'number1' | 'number2' ? number : RawParams[K] }; // 通用转换函数 function convertRawParams(raw: RawParams): TypedParams { return { ...raw, number1: Number(raw.number1), number2: Number(raw.number2) }; } // 转换成类实例(如果需要的话) const myParams = Object.assign(new params(), convertRawParams(x));
这种方式扩展性更强,后续新增字段时,只需要调整类型定义和转换逻辑即可。
小提醒
不管用哪种方式,都建议加个简单的校验,比如检查转换后的数字是否为NaN,避免后续逻辑出问题:
if (isNaN(instance.number1)) { throw new Error(`无效的number1值: ${raw.number1}`); }
内容的提问来源于stack exchange,提问作者David Newswanger
相关产品推荐
相关产品推荐

