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

Angular中如何初始化类?Rails转开发者的困惑

如何优雅初始化Angular中符合TypeScript接口的空实例?

嘿,作为从Rails转Angular的开发者,我太懂你怀念Foo.new那种随手就能创建空模型实例的爽感了!先给你理清几个关键点,再给你几个DRY的解决方案:

首先得明确:TypeScript的接口只是类型定义,不是可实例化的构造函数——它只在编译时做类型检查,运行时根本不存在,所以你没法像Rails模型那样直接Consultation.new。不过我们有很多办法实现类似的效果:

方案1:写一个工厂函数(最灵活,推荐)

你可以封装一个工厂函数,返回符合Consultation接口的默认空实例,还支持传入初始值覆盖默认,完全符合DRY原则:

export interface Consultation { 
  id?: number; 
  submitted?: boolean; 
  showed_up?: boolean; 
  signed_up?: boolean; 
}

// 工厂函数,返回默认空实例,也支持传入部分初始值
export function createConsultation(initialValues?: Partial<Consultation>): Consultation {
  // 定义默认的空值结构
  const defaultValues: Consultation = {
    id: undefined,
    submitted: undefined,
    showed_up: undefined,
    signed_up: undefined
  };
  // 合并默认值和传入的初始值
  return { ...defaultValues, ...initialValues };
}

用的时候就像Rails里那样简洁:

// 创建空实例
const emptyConsultation = createConsultation();

// 创建带初始值的实例
const prefilledConsultation = createConsultation({ submitted: true });

方案2:用实现接口的类(更贴近Rails模型的体验)

如果你更习惯类的写法,可以让类实现你的Consultation接口,然后用构造函数处理默认值和初始值:

export interface Consultation { 
  id?: number; 
  submitted?: boolean; 
  showed_up?: boolean; 
  signed_up?: boolean; 
}

export class Consultation implements Consultation {
  id?: number;
  submitted?: boolean;
  showed_up?: boolean;
  signed_up?: boolean;

  // 构造函数接受可选的初始值对象,自动赋值到实例
  constructor(initialValues?: Partial<Consultation>) {
    Object.assign(this, initialValues);
  }
}

现在你就能像Rails里那样用new创建实例了:

// 空实例
const emptyConsultation = new Consultation();

// 带初始值的实例
const prefilledConsultation = new Consultation({ showed_up: false });

这个方案的好处是,如果你后续需要给Consultation添加方法(比如验证、格式化),类的结构会更方便扩展。

方案3:类型断言(最简单但不够灵活)

如果你的接口全是可选字段,也可以直接用类型断言快速创建空对象,但这种方式没有默认值的保障,也不支持批量传入初始值,只适合临时场景:

const emptyConsultation = {} as Consultation;

总结

如果你只是需要一个符合类型的空对象,工厂函数足够轻便;如果需要类似Rails模型的可扩展能力,实现接口的类是更好的选择——两种方案都能帮你摆脱重复代码,实现类似Foo.new的简洁体验。

内容的提问来源于stack exchange,提问作者Jeremy Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:19:04