evanw/esbuild

decorators on uninitialized class fields are not working when `useDefineForClassFields: false`

Closed this issue · 0 comments

Related: #3911, vitejs/vite#18105

Full code to compare with tsc is here https://github.com/hi-ogawa/reproductions/tree/main/vite-18105-decorator-useDefineForClassFields

Here is a part of the code on esbuild try

function testDecorator(_value: unknown, context: DecoratorContext) {
	if (context.kind === "field") {
		return () => "dec-ok";
	}
}

class DecClass {
	@testDecorator
	decInit = "init";

	@testDecorator
	decNoInit: any;
}

console.log(new DecClass())
// esbuild: DecClass { decInit: 'dec-ok' }
// tsc:     DecClass { decInit: 'dec-ok', decNoInit: 'dec-ok' }

Vite uses useDefineForClassFields: false for esbuild transform when users don't not explicitly set, but this specific decorator usages being not working seems to lead to a bit surprising behavior.