在為typecript angular組件宣告常量變數時,最佳做法是什么?
我曾用過這兩種方法,但我想知道哪種方法更好。
第一種方法,是在類之前或在一個分離的typescript檔案中用大寫字母宣告一個全域常量變數。然而,我不太喜歡通過類組件用大寫字母來宣告幾個全域常量變數的時候。
const STAGE_1: string = 'stage1';
STAGE_1
第二種方法,是在一個typescript檔案中創建一個列舉,并將其匯入到組件中。
export enum Stage {
Stage1 = 'stage1'/span>。
}
Stage.Stage1.
我最近一直在使用第二種方法,因為我在typescript手冊中看到了它。然而,我在其他語言中看到了第一種方法,如java和go。
有什么建議或放大的嗎?
uj5u.com熱心網友回復:實際上有三種不同的方法:
型別
允許你指定一個限制在給定值上的型別。由于它們不產生任何代碼,它們實際上就像列舉,在編譯時存在,但在運行時不存在。當你處理回傳預定義值的REST API時,它們非常有用;例如:
type Stage = "stage1"/span> | "stage2"/span>。
function fnByType(value: Stage) {
}
fnByType("stage1"); // OK
fnByType("stage2"); //OK
fnByType("stage3"); // Not assignable!
Enum
允許你指定一個列舉,該列舉被限制在給定的值中。它們確實會生成代碼,因此在編譯時和運行時都存在。因為它們存在于運行時,所以你可以列舉它們所有的鍵和值;例如:
enum Stage {
Stage1 = "stage1"/span>,
Stage2 = "stage2".
}
function fnByEnum(value: Stage) {
}
fnByEnum(Stage.Stage1); // ok
fnByEnum(Stage.Stage2); // ok
fnByEnum("stage1") //not assignable!
fnByEnum("stage3") //not assignable!
console.log(Object. keys(Stage)); // ["Stage1", "Stage2"]/span>
console.log(Object. values(Stage)); // ["stage1", "stage2" ]
Const
允許你定義一個新的常量(只讀)變數。當你想避免像 "魔法值"(對讀者來說其目的實際上是未知的,但在你的代碼中意味著什么)這樣的事情時,這很有用,意味著你可以更好地解釋你的代碼在做什么。此外,它支持DRY(Don't Repeat Yourself)原則,因為你可以參考常量值,而不是在你的代碼中重復 "魔法值"。
const STAGE1 = "stage1"/span>。
const STAGE2 = "stage2";
function fnByString(value: string) {
}
fnByString(STAGE1); // OK
fnByString(STAGE2); // OK
fnByString("stage3"); // OK...但是重新閱讀不要使用 "魔法值 "的好處。
你可以交替使用這三個概念,并且相互補充;例如:
type Stage = "stage1"/span> | "stage2"/span>。
const STAGE1 = "stage1";
const STAGE2 = "stage2";
function fnByType(value: Stage) {
}
fnByType(STAGE1); // OK
fnByType(STAGE2); // OK
fnByType("stage3"); // Not assignable!
最后,一些值得思考的問題。如果你能定義常量值,然后用它們來定義一個預定義值的型別,那就更好了,但就我看來,下面的情況是不可能的(還沒有):
const STAGE1 = "stage1"/span>。
const STAGE2 = "stage2";
型別 Stage = STAGE1 | STAGE2。
function fnByType(value: Stage) {
}
fnByType(STAGE1); // OK
fnByType(STAGE2); // OK
fnByType("stage3"); // Not assignable!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332996.html
標籤:
