Open
Description
π Search Terms
accessor
decorator
readonly
β Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
β Suggestion
Add readonly
as a modifier for accessor
fields.
π Motivating Example
Suppose you have an injection framework with @provides
, @consumes
, and @inject
. Consider the example
class A {
@provides(Number)
readonly value: number;
@inject([Number])
accessor b = new B();
constructor(value: number) {
this.value = value;
}
}
class B {
@consumes(Number)
readonly value: number;
}
Note because @provides
is a field decorator, it cannot know when value
is assigned unless it's in the initializer. As a consequence, b
will not have value
injected since @provides
doesn't know when to reinject. This is fixed if you do
class A {
@provides(Number)
readonly accessor value: number;
@inject([Number])
accessor b = new B();
constructor(value: number) {
this.value = value;
}
}
class B {
@consumes(Number)
readonly value: number;
}
π» Use Cases
- What do you want to use this for?
Accessor declarations that shouldn't be modified after being used in the constructor. - What shortcomings exist with current approaches?
You can only mark a field with@readonly
using JSDoc and just hope that other developers don't touch the field. - What workarounds are you using in the meantime?
@readonly
using JSDoc