While looking through some TypeScript 2.7 samples, I noticed the following syntax:
class User {
// Notice the exclamation mark
username!: string;
constructor(username: string) {
this.initialize(username);
}
private initialize(username: string) {
this.username = username;
}
}
This syntax comes into play when you use another TypeScript 2.7 compiler option; strict property initialization. If the --strictPropertyInitialization
flag is enabled, the type checker verifies that each instance property declared in a class either
- has a type that includes
undefined
, - has an explicit initializer
- is initialized within the constructor
This is problematic if you want to initialize a property within a helper method or have a dependency injection framework do it for you. To solve this situation you can use a definite assignment assertion using the exclamation mark: (!) . Now the type checker will no longer complain.
Remark: By using a definite assignment assertion it becomes your responsibility to make sure the property gets set.