在本系列文中,所有的程式碼都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-21 並且有測試可以讓大家練習。
今天我們使用 Either 來包裝 JSON.stringify,跟昨天的 JSON.parse 一樣,正常使用的時候,這些函式的型別並不會告知使用者會有 exception 的可能性,這樣可能導致 runtime 時出現無法預期的錯誤。
// Type: (value: any, replacer?: (string | number)[] | null | undefined, space?: string | number | undefined) => string | unknown
const normalStringify = (...args: Parameters<typeof JSON.stringify>) => {
try {
return JSON.stringify(...args);
} catch (error) {
return error;
}
};
跟昨天的 normalParse 一樣,輸出型別只會有 string | unknown,這邊使用 Either 來改善他的型別,讓使用函式的人可以了解使用的風險。
// Type: (value: any, replacer?: (string | number)[] | null | undefined, space?: string | number | undefined) => E.Right<string> | E.Left<unknown>
const stringify = (...args: Parameters<typeof JSON.stringify>) => {
try {
const stringified = JSON.stringify(...args);
if (typeof stringified !== 'string') {
throw new Error('Unsupported structure');
}
return E.right(stringified);
} catch (error) {
return E.left(error);
}
};
每次使用 stringify 函式的時候,都會需要考慮兩種情況(left and right),這樣可以有效降低無法預期的風險。
今天的主題在 should-i-use-fp-ts 在 src/day-21 並且有測試可以讓大家練習。