我發現自己很想做這樣的事情(偽代碼):
const something = somethingElse || throw an error
如果somethingElse為假,這將引發錯誤。這是另一個例子,用真正的打字稿寫成:
const accessToken = process.env.ACCESS_TOKEN ?? throw new Error("The environment variable ACCESS_TOKEN was undefined or null");
這不會編譯,因為右側需要是一個運算式。有沒有辦法撰寫功能上與上述相同的代碼,同時又具有可比性?
我可以執行以下操作,但我發現打字很煩人,而且會占用大量垂直空間:
const accessToken = process.env.PATREON_CREATORS_ACCESS_TOKEN;
if (accessToken === undefined) {
throw new Error("The environment variable PATREON_CREATORS_ACCESS_TOKEN was undefined");
}
我還可以創建一些實用程式函式,您可以在其中傳遞一些潛在的錯誤資訊,如果它是錯誤的,則拋出錯誤。但我想知道 typescript/javascript 是否提供了一些巧妙的語法來實作這一點,所以我不必創建這樣的函式。
uj5u.com熱心網友回復:
這在 TypeScript 中目前不存在。一般來說,TypeScript 不采用從非 JavaScript 語法生成 JavaScript 輸出的功能。(好吧,它不再這樣做了。一些較舊的功能,如列舉和引數屬性肯定會以這種方式運行。但如果這些功能尚不存在,如果您今天建議它們,它們將被拒絕。)如果您提交新的功能請求,您應該選中一個框,以確認建議“不是運行時功能(例如庫功能、帶有 JavaScript 輸出的非 ECMAScript 語法、JS 的新語法糖等)”。從現在開始,如果我們想在 TypeScript 中看到新的運行時特性,它們應該被提交給 TC39,一旦提案達到TC39 流程的第 3 階段,TypeScript 將實施它。
有一個為“現有提案throw表達”已在2017年一直坐在第2階段,因為有時,所以它不看好。在microsoft/TypeScript#18535上還有一個 TypeScript GitHub 問題,并停留在“等待 TC39”狀態。我想我們不會很快看到這個。
在throw運算式提案中,有一種解決方法可以實作類似 throwable 運算式的內容:
const __throw = (err: any) => { throw err; };
您可以在示例中看到:
process.env.ACCESS_TOKEN = (Math.random() < 0.5) ? "a token" : undefined;
const accessToken = process.env.ACCESS_TOKEN ??
__throw(new Error("The environment variable ACCESS_TOKEN was undefined or null"));
// maybe ?? The environment variable ACCESS_TOKEN was undefined or null
// but if it gets here then the compiler knows accessToken is defined:
console.log(accessToken.toUpperCase()); // A TOKEN
所以這可能是你現在能得到的最接近的結果;您可以撰寫自己的自定義實用程式函式,也可以低溫保存自己,直到throw運算式達到 TC39 程序的第 3 階段。
Playground 鏈接到代碼
uj5u.com熱心網友回復:
也許我誤解了您的標準,但使用函式似乎很容易:
TS游樂場
// https://developer.mozilla.org/en-US/docs/Glossary/Falsy
type Falsy = false | 0 | -0 | 0n | '' | null | undefined;
function truthy <T>(expr: T, msg = ''): Exclude<T, Falsy> {
if (!expr) throw new Error(msg);
return expr as Exclude<T, Falsy>;
}
declare const process: { env: Record<string, string | undefined> };
const accessToken = truthy(process.env.ACCESS_TOKEN, 'The environment variable ACCESS_TOKEN was undefined or null');
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387153.html
標籤:javascript 打字稿
