TypeScript带命名参数的构造函数是否有快捷写法?是否支持命名构造函数?
问题解答
一、代码的简洁写法
你可以通过两种方式简化这段TypeScript代码:
方式1:利用参数属性省略重复声明
TypeScript的参数属性允许你在构造函数参数前添加访问修饰符(如public),自动完成类属性的声明和赋值,省去冗余代码:
import { Model } from "../../../lib/db/Model"; export enum EUserRole { admin, teacher, user, } export class UserModel extends Model { constructor( public name: string, public phoneNo: number, public role: EUserRole, public createdAt: Date ) { super(); } }
方式2:结合接口与Object.assign简化解构赋值
如果需要保留对象解构的传参方式,可以先定义参数接口,再用Object.assign一次性完成属性赋值:
import { Model } from "../../../lib/db/Model"; export enum EUserRole { admin, teacher, user, } interface UserModelProps { name: string; phoneNo: number; role: EUserRole; createdAt: Date; } export class UserModel extends Model { name: string; phoneNo: number; role: EUserRole; createdAt: Date; constructor(props: UserModelProps) { super(); Object.assign(this, props); } }
二、TypeScript中的“命名构造函数”
TypeScript没有原生的“命名构造函数”语法,但可以通过静态工厂方法实现等价效果:在类内部定义静态方法,作为特定场景下的实例创建入口,模拟命名构造函数的功能。
示例代码:
export class UserModel extends Model { constructor( public name: string, public phoneNo: number, public role: EUserRole, public createdAt: Date ) { super(); } // 模拟命名构造函数:创建默认普通用户 static createDefaultUser(name: string, phoneNo: number): UserModel { return new UserModel(name, phoneNo, EUserRole.user, new Date()); } // 模拟命名构造函数:创建管理员用户 static createAdminUser(name: string, phoneNo: number): UserModel { return new UserModel(name, phoneNo, EUserRole.admin, new Date()); } }
使用时直接调用静态方法即可:
const regularUser = UserModel.createDefaultUser("张三", 13800138000); const adminUser = UserModel.createAdminUser("李四", 13900139000);
内容的提问来源于stack exchange,提问作者Chinmoy kr
相关产品推荐
相关产品推荐

