Node.js+TypeScript如何在类型转换时移除接口未定义的属性
解决方案
TypeScript 的类型系统是编译时静态类型系统,所有类型相关的语法仅在编译阶段生效,编译为 JavaScript 后所有类型定义都会被完全擦除。你用到的 as 属于类型断言语法,仅用于告诉编译器「我确认当前对象符合目标接口类型」,不会对运行时的实际对象产生任何修改,因此不会自动删除未定义的属性。
以下是可实现需求的几种常用方案:
方案1:手动解构(适合属性少的场景)
直接从原对象中摘出需要的属性构建新对象,零额外依赖:
interface IFooReal { prop1: string; } const objTMP = {prop1: 'foo001', prop2: 'foo002', prop3: 'foo003'}; // 解构提取需要的属性 const { prop1 } = objTMP; const barr: IFooReal = { prop1 }; console.log(barr); // 输出 { prop1: 'foo001' }
方案2:通用属性筛选函数(适合属性较多的场景)
封装一个类型安全的通用pick函数,传入要保留的属性名列表即可:
// 通用筛选函数,仅保留指定属性 function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { return Object.fromEntries( keys.map(key => [key, obj[key]]) ) as Pick<T, K>; } // 使用示例 interface IFooReal { prop1: string; } const objTMP = {prop1: 'foo001', prop2: 'foo002', prop3: 'foo003'}; const barr = pick(objTMP, ['prop1']); console.log(barr); // 输出 { prop1: 'foo001' }
该方案支持类型校验,传入的属性名如果不存在于原对象上,编译器会直接报错。
方案3:运行时类型校验(适合复杂业务场景)
如果需要同时做运行时类型校验 + 自动过滤多余属性,可以使用运行时类型校验库,先定义运行时可用的结构Schema,再通过Schema解析对象,会自动过滤未定义的属性,同时还能做字段合法性校验。
示例(使用Zod库):
import { z } from 'zod'; // 定义Schema,同时可以导出对应的TS类型 const FooRealSchema = z.object({ prop1: z.string() }); type IFooReal = z.infer<typeof FooRealSchema>; const objTMP = {prop1: 'foo001', prop2: 'foo002', prop3: 'foo003'}; // 解析后自动过滤多余属性 const barr = FooRealSchema.parse(objTMP); console.log(barr); // 输出 { prop1: 'foo001' }
内容的提问来源于stack exchange,提问作者Luciano Castro
相关产品推荐
相关产品推荐

