TypeScript中如何列出类的所有可能属性?Angular场景实操疑问
解决Angular中遍历表单值并区分类属性的问题
你遇到的核心问题是TypeScript的类可选属性在运行时不存在——因为TypeScript的类型信息是编译时的,未初始化的可选属性不会被添加到类实例中,所以hasOwnProperty自然检测不到。
下面是几种可行的解决方案:
方案一:手动维护类属性列表
直接定义包含类所有属性的数组,通过判断key是否在数组中来区分:
class CustomClass { prop1?: string; prop2?: string; } // 手动列出CustomClass的所有属性 const customClassProps = ['prop1', 'prop2'] as const; const myObj: CustomClass = new CustomClass(); const data = {}; const formValues = { prop1: "should go to myObj", prop3: "should go to data" } for (const [key, value] of Object.entries(formValues)) { if (customClassProps.includes(key as typeof customClassProps[number])) { // 类型断言避免TS报错 (myObj as Record<string, unknown>)[key] = value; } else { data[key] = value; } }
方案二:利用TypeScript的keyof实现类型安全检测
通过keyof CustomClass获取类的属性类型,生成属性数组,这样类属性变化时TS会自动提示更新数组,避免遗漏:
class CustomClass { prop1?: string; prop2?: string; } // 基于keyof生成属性数组,保证类型一致 const customClassProps = ['prop1', 'prop2'] as (keyof CustomClass)[]; const myObj: CustomClass = new CustomClass(); const data = {}; const formValues = { prop1: "should go to myObj", prop3: "should go to data" } for (const [key, value] of Object.entries(formValues)) { if (customClassProps.includes(key as keyof CustomClass)) { myObj[key as keyof CustomClass] = value as CustomClass[keyof CustomClass]; } else { data[key] = value; } }
方案三:给可选属性设置默认值
如果允许类实例中存在未赋值的可选属性,可以给它们设置默认值,这样hasOwnProperty就能检测到:
class CustomClass { // 给可选属性设置默认值,确保运行时实例存在该属性 prop1?: string = undefined; prop2?: string = undefined; } const myObj: CustomClass = new CustomClass(); const data = {}; const formValues = { prop1: "should go to myObj", prop3: "should go to data" } for (const [key, value] of Object.entries(formValues)) { if (myObj.hasOwnProperty(key)) { (myObj as Record<string, unknown>)[key] = value; } else { data[key] = value; } }
方案对比
- 方案一:简单易实现,但类属性变更时需要手动同步数组,容易出错。
- 方案二:类型安全,TS会帮你校验属性一致性,适合属性较多或经常变动的场景。
- 方案三:保留原有检测逻辑,但会给实例添加冗余属性,适合需要这些属性始终存在的场景。
内容的提问来源于stack exchange,提问作者Igor Cantele
相关产品推荐
相关产品推荐

