在 Typescript 中,為每個列舉實體分配布林值的慣用方法是什么?
假設我有各種錯誤代碼的列舉。對于每個錯誤代碼,我都有一個布林值,說明錯誤是否必須暴露給最終用戶。在 Java 中,我想,
enum MyError {
ERROR1(true),
ERROR2(false),
ERROR3(false);
private boolean expose;
public boolean shouldExpose() {
return expose;
}
MyError(boolean expose) {
this.expose = expose;
}
}
在這里,布爾資訊(是否必須向用戶公開錯誤)被封裝在列舉本身中。
MyError myError = MyError.ERROR1;
System.out.println(myError.shouldExpose()); //true
我怎樣才能在 Typescript 中做到這一點,因為 TS 不允許列舉中的布林值?我應該class在type這里使用 a還是 a ?
目標是在列舉/類/型別中包含布爾資訊。因此,我不想創建像這樣的包裝器型別
{
error: MyError
expose: boolean
}
因為它可以導致錯誤的配置/映射(也能夠具有MyError.ERROR1與暴露為假或反之亦然其他錯誤)。
uj5u.com熱心網友回復:
如果您不關心列舉順序,那么您可以利用數字列舉,例如
enum MyError {
ERROR1 = 1,
ERROR2 = 0,
ERROR3 = 0,
}
console.log(MyError.ERROR1); // 1 == true
console.log(MyError.ERROR2); // 0 == false
console.log(MyError.ERROR3); // 0 == false
console.log(Boolean(MyError.ERROR1)); // true
console.log(Boolean(MyError.ERROR2)); // false
console.log(Boolean(MyError.ERROR3)); // false
uj5u.com熱心網友回復:
您不會嘗試在列舉本身中擬合有關錯誤的資訊。列舉只是為了列出(好吧,列舉)錯誤。他們的暴露程度應該保存在錯誤和“是否暴露?”的答案之間的映射中。問題。
// values don't matter; you can also skip them if you don't care for them
enum Error {
Fatal = 1,
Disk = 2,
NoInternet = 3,
}
const IS_EXPOSED: Readonly<Record<Error, boolean>> = {
[Error.Fatal]: false,
[Error.Disk]: true,
[Error.NoInternet]: true,
}
如果您錯過了IS_EXPOSED物件中的列舉,TypeScript 的型別系統將拋出錯誤,因此它是完全型別安全的。
uj5u.com熱心網友回復:
您可能想要放棄實際的列舉,而是創建自己的一組常量。它更冗長,但它可能滿足您的需求。
const MyError = {
error1: {
name: 'ERROR1',
expose: true
},
error2: {
name: 'ERROR2',
expose: false
},
error3: {
name: 'ERROR3',
expose: false
}
} as const;
type MyError = typeof MyError[keyof typeof MyError]
function x(err: MyError) {
console.log(err);
}
x(MyError.error1);
x({name: 'ERROR1', expose: true});
x({name: 'ERROR1', expose: false}); // EXPECTED ERROR
function getError(): MyError {
return MyError.error1;
}
var e: MyError = getError();
console.log(MyError.error1 == e); // true
console.log(MyError.error2 == e); // false
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/403070.html
標籤:
