TypeScript类成员变量

在类中定义成员变量的方法如下所示:

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修饰符去掉。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!