我是TypeScript的新手。
在Angular项目中,我正在准备SnackBar服务以通知用户。
我有一些Java背景。
我有两个问题。
在TypeScript中定义类时,我不能使用“ const”关键字。而且我的服务将是一个单例,因此如果它在我的整个应用程序中断的地方意外地改变了我的价值。因此,我尝试了私有领域。但是我认为这还不够。
1)TypeScript可以为类字段提供类似const的功能吗?
为我服务:
override func viewDidLoad() {
super.viewDidLoad()
// UI changes
self.view.backgroundColor = appBgColour
// check if the user has registered before
if let asciiCode = defaults.string(forKey: "asciiCode") {
let hashCode = userCode.myHash() // myHash() is an extension to String
dbReference = Database.database().reference(withPath: databaseReferenceName)
dbReference.child("\(hashCode)/checked").observe(.value) { (snapshot) in
if snapshot.exists() {
// a table with this user's Hash'ed code exists
self.isRegistrationNeeded = false
} else {
// user needs to register with a new list
self.isRegistrationNeeded = true
}
}
}
}
2)由于“类型别名”,我的代码未编译。如何将const值用于“类型别名”?
以上类未编译,消息为:
import {Injectable} from '@angular/core';
import {MatSnackBar} from '@angular/material';
@Injectable({
providedIn: 'root'
})
export class SnackService {
private DURATION = 1800;
private HORIZANTAL_POSITION = 'end';
constructor(private sncackBar: MatSnackBar) {
}
successful(message: string) {
this.sncackBar.open(message, null, {
duration: this.DURATION,
horizontalPosition: this.HORIZANTAL_POSITION,
panelClass: 'success-snackBar'
});
}
error(message: string) {
this.sncackBar.open(message, null, {
duration: this.DURATION,
horizontalPosition: this.HORIZANTAL_POSITION,
panelClass: 'error-snackBar'
});
}
}
但是在'MatSnackBarConfig'中,'MatSnackBarHorizontalPosition'已经是字符串。
error TS2345: Argument of type '{ duration: number; horizontalPosition: string; panelClass: string; }' is not assignable to parameter of type 'MatSnackBarConfig<any>'.
Types of property 'horizontalPosition' are incompatible.
答案 0 :(得分:1)
您的问题是字符串文字类型而不是别名。字符串文字类型是string
的子类型,因此您可以将类型'end'
分配给字符串,但不能相反。
您可以使编译器为其字符串字段推断类型为只读
private readonly HORIZANTAL_POSITION = 'end';
如果该字段不是只读的,则可以手动指定类型
private HORIZANTAL_POSITION : MatSnackBarHorizontalPosition = 'end';