iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Software Development

Should I use fp-ts系列 第 20

[Should I use fp-ts?] Day 20 - fp-ts Either trycatch

  • 分享至 

  • xImage
  •  

在本系列文中,所有的程式碼都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-20 並且有測試可以讓大家練習。

Either trycatch

前兩天介紹到 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-tssrc/day-20 並且有測試可以讓大家練習。

Reference

Either.ts | fp-ts


上一篇
[Should I use fp-ts?] Day 19 - fp-ts Either usage
下一篇
[Should I use fp-ts?] Day 21 - fp-ts Either trycatch 2
系列文
Should I use fp-ts25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言