如何将字符串类型age转为数字类型以避免TypeScript编译错误?
解决TypeScript字符串转数字的类型兼容问题
你的问题核心是合并对象时,原JsonType的string类型age和转换后的number类型age共存,导致类型冲突。以下是两种可靠的解决方式:
方法一:解构分离原属性,重新构造对象
通过解构把原item中的age单独提取处理,剩余属性保留,再合并转换后的age(或不添加),从根源避免类型重叠:
interface JsType{ name: string age?: number //... more fields } interface JsonType{ name: string age?: string //... more fields } const filterData: JsType[] = [{name: 'magnus'}, {name:'hikaru',age: "50"}].map((item: JsonType): JsType => { // 解构分离原字符串类型的age和其他属性 const { age: stringAge, ...rest } = item; // 转换为number,若原age不存在则设为undefined const age = stringAge ? Number(stringAge) : undefined; // 合并属性,仅当age有效时添加 return { ...rest, ...(age !== undefined ? { age } : {}) }; })
方法二:处理转换后的类型断言(谨慎使用)
如果确认转换逻辑不会产生异常值(比如NaN),可以在返回时用类型断言告诉TypeScript当前对象符合JsType:
const filterData: JsType[] = [{name: 'magnus'}, {name:'hikaru',age: "50"}].map((item: JsonType): JsType => { let age: number | undefined = item.age ? Number(item.age) : undefined; // 先删除原item中的string类型age,再添加转换后的number类型age const { age: _, ...rest } = item; const doc = { ...rest, ...(age ? { age } : {}) }; // 类型断言 return doc as JsType; })
额外优化:避免NaN问题
Number("abc")会返回NaN(属于number类型,但不符合业务预期),可以添加校验确保转换结果有效:
const age = stringAge ? (isNaN(Number(stringAge)) ? undefined : Number(stringAge)) : undefined;
内容的提问来源于stack exchange,提问作者Paviter Singh
相关产品推荐
相关产品推荐

