如何为TypeScript“类型别名”类型使用常量值?

时间:2018-07-17 11:32:43

标签: angular typescript angular-material2

我是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'中,'MatSnackBarHorizo​​ntalPosition'已经是字符串。

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.

1 个答案:

答案 0 :(得分:1)

您的问题是字符串文字类型而不是别名。字符串文字类型是string的子类型,因此您可以将类型'end'分配给字符串,但不能相反。

您可以使编译器为其字符串字段推断类型为只读

private readonly HORIZANTAL_POSITION = 'end';

如果该字段不是只读的,则可以手动指定类型

private HORIZANTAL_POSITION : MatSnackBarHorizontalPosition = 'end';