Description
When useDefineForClassFields
is false, es2022
transforms simple static class fields into class static init blocks. This is a problem for users that need useDefineForClassFields
(lit requires this). As well, class fields and class private members are widely supported, where class static init blocks are not. Class fields have smaller bytecounts than transformed output, and are easier to read. I understand that the code is equivalent on an engine which supports static class blocks, but this presents a serious problem for some users, and I think TSC should provide an escape hatch.
Don't get me wrong, I think static blocks are super cool, and I'm looking forward to using them, but many users will want to use es2022
to get native private class members, which are widely supported, but they'll get stuck with static init blocks that they didn't write in source - a syntax error in most toolchains and on apple's monopoly engine webkit
https://www.typescriptlang.org/play?target=9#code/MYGwhgzhAECC0G8BQ1XQgFzBglsaY0AvNAORikDcSAvkA
input:
class A {
static a = 'a';
}
output:
"use strict";
class A {
static { this.a = 'a'; }
}
In my case, I have library sources that use decorators and need to be compiled with set semantics, but I also want them to have untranspiled private fields, which are widely supported.
Thank you for considering this case.
Originally posted by @bennypowers in #46291 (comment)