Skip to content
9 changes: 9 additions & 0 deletions src/transformation/visitors/class/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,15 @@ function transformClassLikeDeclaration(
lua.createExpressionStatement(createClassPropertyDecoratingExpression(context, member, className))
);
}
} else if (ts.isClassStaticBlockDeclaration(member)) {
if (member.body.statements.length > 0) {
const bodyStatements = context.transformStatements(member.body.statements);
const iif = lua.createFunctionExpression(lua.createBlock(bodyStatements), [
lua.createIdentifier("self"),
]);
const iife = lua.createCallExpression(iif, [className]);
result.push(lua.createExpressionStatement(iife, member));
}
}
}

Expand Down
19 changes: 19 additions & 0 deletions test/unit/classes/classes.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -799,3 +799,22 @@ test.each(['(this["bar"])', '((((this["bar"]))))'])("methods in parentheses pass
export const result = inst.foo();
`.expectToMatchJsResult();
});

// https://github.com/TypeScriptToLua/TypeScriptToLua/issues/1447
test("static initialization block (#1447)", () => {
util.testModule`
class A {
private static staticProperty1 = 3;
public static staticProperty2;
static {
this.staticProperty2 = this.staticProperty1 + 5;
}
public static staticProperty3;
static {
this.staticProperty3 = this.staticProperty1 + this.staticProperty2;
}
}
export const result1 = A.staticProperty2;
export const result2 = A.staticProperty3;
`.expectToMatchJsResult();
});