我想創建一個函式來嘗試運行提供的函式,除非它回傳一個真實值,否則會拋出,如下所示:
function test<T>(runnable: () => T): T {
const value = runnable();
if (! value) throw new Error(`Only truthy`);
return value;
}
const a = test(() => {
return (Math.random() < 0.5) ? undefined : "ok";
});
console.log(a);
如何更改 的定義,test以便 TS 知道它a始終是一個字串,而不是string|undefined?
uj5u.com熱心網友回復:
如果您將 falsy 型別作為內部函式回傳型別的一部分,而不是外部函式型別的一部分,那么這是可能的:
首先,創建一個Falsy型別別名:
type Falsy = false | null | undefined | 0 | ''
現在與T內部函式回傳型別進行聯合:
function test<T>(runnable: () => T | Falsy): T {
const value = runnable();
if (!value) throw new Error(`Only truthy`);
return value;
}
這意味著T推斷不包括Falsy型別。并且允許內部runnable函式回傳T或任何Falsy型別。然后檢查Falsy型別并僅當值不是 a 時才繼續回傳Falsy,它必須是 a T。
現在這個函式有一個回傳型別,"ok"因為錯誤會捕獲所有其他結果。
const a = test(() => {
return (Math.random() < 0.5) ? undefined : "ok";
});
a // type: "ok"
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464401.html
