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

TypeScript如何省略类成员声明与构造函数初始化的样板代码?

TypeScript简化类属性声明与初始化的方案

针对你提到的需要减少类属性重复声明、赋值样板代码的需求,有两种成熟的实现方案:

方案1:构造函数参数属性(入参直接作为类成员场景)

如果你的类成员直接等于构造函数的入参,可直接使用TypeScript原生支持的构造函数参数属性语法:给构造函数入参添加public/private/protected/readonly修饰符,TS会自动完成类属性声明和赋值操作。
示例:

// 原有写法
class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

// 简化后写法
class Person {
  constructor(public name: string, public age: number) {}
}

两种写法的运行时效果完全一致,无额外性能开销,且保留完整类型检查。

方案2:Object.assign + 声明合并(成员需要基于入参计算场景)

如果你的类成员是像示例中那样需要基于入参计算得到,可通过Object.assign批量赋值,配合TS的声明合并特性省略属性声明:

// 声明接口定义所有类成员的类型,和下方类自动合并
interface MyClass extends Record<'c' | 'avg' | 'diam', number> {}
class MyClass {
  constructor(a: number, b: number) {
    // 批量赋值所有计算后属性到实例
    Object.assign(this, {
      c: Math.sqrt(a * a + b * b),
      avg: (a + b) / 2,
      diam: Math.abs(b - a)
    })
  }
}

如果不想单独定义接口,也可以保留类顶部的属性声明,仅用Object.assign省略重复的this.xxx = xxx赋值代码,也能减少样板代码量。

注意事项

  • 构造函数参数属性必须添加修饰符才会生效,未加修饰符的入参不会被自动声明为类成员
  • Object.assign仅适用于赋值实例自有属性,类的方法、访问器属性需要单独定义

内容的提问来源于stack exchange,提问作者Adam Gawne-Cain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:36:04