You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:15:37