在类中定义成员变量的方法如下所示:
class Circle {
radius: number = 1;
}
Circle类只包含一个成员变量。其中,radius
是成员变量名,成员变量名之后的类型注解定义了该成员变量的类型。最后,我们将该成员变量的初始值设置为1
。
除了在成员变量声明中设置初始值,我们还可以在类的构造函数中设置成员变量的初始值。
class Circle {
radius: number;
constructor() {
this.radius = 1;
}
}
此例中,在构造函数里将radius成员变量的值初始化为1。同时注意,在构造函数中引用成员变量时需要使用this
关键字。
–strictPropertyInitialization
虽然为类的成员变量设置初始值是可选的,但是对成员变量进行初始化是一个好的编程实践,它能够有效避免使用未初始化的值而引发的错误。
TypeScript提供了“--strictPropertyInitialization”
编译选项来帮助严格检查未经初始化的成员变量。当启用了该编译选项时,成员变量必须在声明时进行初始化或者在构造函数中进行初始化,否则将产生编译错误。
需要注意的是,
“--strictPropertyInitialization”
编译选项必须与“--strictNullChecks”
编译选项同时启用,否则“--strictPropertyInitialization”
编译选项将不起作用。示例如下:
/**
* --strictNullChecks=true
* --strictPropertyInitialization=true
*/
class A {
// 正确
a: number = 0;
// 正确,在构造函数中初始化
b: number;
// 错误!未初始化
c: number;
constructor() {
this.b = 0;
}
}
类A的成员变量a
在声明时进行了初始化,成员变量b在构造函数中进行了初始化,只有成员变量c始终没有进行初始化,因此将产生未初始化的编译错误。
若启用了“--strictPropertyInitialization”
编译选项并且仅在构造函数中对成员变量进行了初始化操作,那么需要在构造函数中直接进行赋值操作。如果通过在构造函数中调用某个方法,进而在该方法中间接地初始化成员变量,那么编译器将无法检测到该初始化操作,因此会产生编译错误。示例如下:
/**
* --strictNullChecks=true
* --strictPropertyInitialization=true
*/
class A {
// 编译错误!未初始化
a: number;
init() {
this.a = 0;
}
constructor() {
this.init();
}
}
我们在构造函数中调用了init方法对成员变量a
进行了初始化,但是编译器却无法检测到成员变量a
已经被初始化。
在一些场景中,我们确实想要通过调用某些方法来初始化类的成员变量。这时可以使用非空类型断言“!”
来通知编译器该成员变量已经进行初始化,以此来避免产生编译错误。示例如下:
/**
* --strictNullChecks=true
* --strictPropertyInitialization=true
*/
class A {
a!: number;
// ~
// 非空类型断言
init() {
this.a = 0;
}
constructor() {
this.init();
}
}
readonly属性
在声明类的成员变量时,在成员变量名之前添加readonly
修饰符能够将该成员变量声明为只读的。只读成员变量必须在声明时初始化或在构造函数里初始化。示例如下:
class A {
readonly a = 0;
readonly b: number;
readonly c: number; // 编译错误
constructor() {
this.b = 0;
}
}
此例中,只读成员变量a
在声明时进行了初始化,只读成员变量b
在构造函数中进行了初始化,而只读成员变量c
没有进行初始化,因此将产生编译错误。
不管是在类的内部还是外部,都不允许修改只读成员变量的值。例如,下例中对类A的成员变量a
的修改将产生编译错误:
class A {
readonly a = 0;
m() {
this.a = 1;
// ~
// 编译错误!不能赋值给 'a',因为它是只读属性
}
}
const obj = new A();
obj.a = 1;
// ~
// 编译错误!不能赋值给 'a',因为它是只读属性
关于类只读成员变量的一个最佳实践是,若类的成员变量不应该被修改,那么应该为其添加readonly
修饰符。就算不确定是否允许修改类的某个成员变量,也可以先将该成员变量声明为只读的,当发现需要对该成员变量进行修改时再将readonly
修饰符去掉。
酷客网相关文章:
评论前必须登录!
注册