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
相关产品推荐
相关产品推荐

