在本系列文中,所有的程式碼都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-20
並且有測試可以讓大家練習。
前兩天介紹到 Either
的特性還有一些基礎的用法,大家是否有感覺到 Either
可以和 trycatch
結合使用?
我們使用 JSON.parse
來做範例,很多時候使用這兩個函式的時候編譯器並不會出現錯誤,但實際 runtime 的時候卻炸開,如果我們想要確保不會炸開的話就要使用 trycatch
來確保使用的過程都可以被 catch
起來。
// Type: (text: string, reviver?: ((this: any, key: string, value: any) => any) | undefined) => unknown
const normalParse = (...args: Parameters<typeof JSON.parse>) => {
try {
return JSON.parse(...args);
} catch (error) {
return error;
}
};
可是在這種情況下型別提示並不會顯示他有 Error
的可能性,而是單純的 unknown
,這樣很可能讓其他人使用這個函式的時候忽略了有 exception
的可能性。
不過如果善用 Either
的特性就可以讓型別更有鑑別度以及使用性。
// Type: (text: string, reviver?: ((this: any, key: string, value: any) => any) | undefined) => E.Either<Error, unknown>
const parse = (...args: Parameters<typeof JSON.parse>) => E.tryCatch(
() => JSON.parse(...args), // E.right<unknown>
e => e instanceof Error ? e : new Error('Unexpected error'), // E.left<Error>
);
這樣每次使用 parse
函式的時候,都可以確保我們需要考慮 left
以及 right
兩個不同的情境。
今天的主題在 should-i-use-fp-ts 在 src/day-20
並且有測試可以讓大家練習。