In typescript, why isn't it possible to initialize a class property by calling a method?
The following typescript code works as expected but typescript throws a TS2564 error on the test2 and test3 properties. Is it because they are initialized inside of methods? How should a class like this be written.
I believe it works as expected because it is valid in javascript. Could it be caused by wrong typescript settings?
class class1{
test1:number;//test1 is initialized as expected
test2:number;//Property 'test2' has no initializer and is not definitely assigned in the constructor.
test3:number;//Property 'test3' has no initializer and is not definitely assigned in the constructor.
constructor(){
//test1
this.test1 = 0;
//test2
const setTest2To0 = () =>{
this.test2 = 0;
};
setTest2To0();
//test3
this.setTest3To0();
}
setTest3To0(){
this.test3 = 0;
}}
TypeScript does not track this
mutations in this case.
However, there is a workaround. You can use IIFE pattern for declaring test2
property.
class class1 {
test1: number;//test1 is initialized as expected
test2: number;// ok
test3: number;//Property 'test3' has no initializer and is not definitely assigned in the constructor.
constructor() {
//test1
this.test1 = 0;
//test2
(() => {
this.test2 = 0;
})();
//test3
this.setTest3To0();
}
setTest3To0() {
this.test3 = 0;
}
}
As you might have noticed, TS is able to figure out that test2
is initialized in constructor
.
Please keep in mind that typescript is about static validation.
So it is impossible to use setTest3To0 to initialize Test3?
Yes. You should use test3: number | undefined
. Or you can use another syntax:
class class1 {
static getTest3() {
return 0
}
constructor(public test1 = 0, public test2 = 0, public test3 = class1.getTest3()) { }
}
If you use public
keyword there is no need to declare all your properties as you did before. As you might have noticed I have used static method for setting test3
during class initialization.