TypeScript实现Python dataclass init=False效果:禁止传入指定构造参数
TypeScript中实现类似Python dataclass
init=False 的效果,禁止用户传入特定类成员参数 要实现禁止用户传入grades这类参数、同时保留类成员定义的需求,核心是将该成员从构造函数参数列表中移除,改为在类内部直接初始化,这样用户无法通过实例化时传参覆盖默认值。
问题原因
你当前的代码中,grades是构造函数的参数,即使设置了默认值,只要用户在实例化时传入了值(比如空Map),就会直接覆盖默认的包含"calculus":100的Map,导致最终输出undefined。
解决方案代码
class Person { // 直接在类中初始化grades,不放入构造函数参数 public grades: Map<string, number> = new Map([["calculus", 100]]); constructor( private name: string, private salary: number ) {} } const p = new Person("oren", 7400); // 此时无法传入grades参数,编译器会报错 console.log(p.grades.get("calculus"));
运行结果
% npx tsc --esModuleInterop example.ts % node example.js 100 # 符合预期
说明
- 这种方式下,
grades是类的实例属性,每次创建Person实例时都会自动初始化指定的Map,用户完全无法通过构造函数传入值来修改它,完美对应Python dataclass中init=False的效果——该成员不由构造函数初始化,而是由类自身管理。 - 如果尝试在实例化时传入第三个参数(比如
new Person("oren", 7400, new Map())),TypeScript编译器会直接抛出错误,从语法层面禁止了这种操作。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

