我撰寫了以下函式來幫助處理錯誤
const capture = <T>(
callback: () => T
): { result?: T; error?: Error } => {
try {
return { result: callback(), error: undefined };
} catch (err) {
return { result: undefined, error: err as Error };
}
};
用法示例:
const { result, error } = capture<number>(() => foo());
if (error) badPath();
console.log("hooray we got a result", result)
但是 TypeScript 編譯器會抱怨:
Object is possibly 'undefined'. ts(2532)
const result: number | undefined
我理解編譯器為什么會抱怨(這是使用可選引數的預期行為)。
但是我想知道是否存在一些可以支持條件回傳型別的 TypeScript 惡作劇。
即有沒有一種方法可以指定capture的簽名,以便在error不存在時result推斷存在?反之亦然?
uj5u.com熱心網友回復:
- 將
capture函式的回傳值定義為{ result: T; error: undefined; } | { result: undefined; error: Error; }。 - 不要解構回傳型別;而是檢查它的屬性。在這種情況下,TypeScript 還不夠智能,無法鏈接不同變數的型別。
const capture = function<T>(
callback: () => T
): { result: T; error: undefined; } | { result: undefined; error: Error; } {
try {
return { result: callback(), error: undefined };
} catch (err) {
return { result: undefined, error: err as Error };
}
}
const retVal = capture<number>(() => foo());
if (retVal.error)
badPath();
else
console.log("hooray we got a result", retVal.result);
請參閱此
const capture = <T>(callback: () => T | undefined): { result?: T; error?: Error } => {
try {
return { result: callback(), error: undefined }
} catch (err) {
return { result: undefined, error: err as Error }
}
}
const start = () => {
const { result, error } = capture<number>(() => foo())
if (error || !result) {
// something
return
}
// result // here it will be `number`
// (cannot be undefined because we checked)
console.log('hooray we got a result', result)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/373479.html
標籤:打字稿
