在本系列文中,所有的程式碼都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-22
並且有測試可以讓大家練習。
使用 functional programming
中的 pure function
會有以下幾個特性:
Apply
來讓 ADT
的判斷有並行的功能,先來看程式碼,這邊的錯誤我們使用 day-18
的範例來進行,這邊比較不同的是所有的錯誤情境都是回傳一個 Array<stirng>
方便我們組合所有的錯誤。type User = {
username: string;
email: string;
password: string;
};
const validateE = E.getApplicativeValidation(A.getMonoid<string>());
const sequenceValidateE = Ap.sequenceT(validateE);
const moreThan3Chars = E.fromPredicate(
(xs: string) => xs.length > 3,
() => ['Need more than 3 chars'],
);
const validateEmail = E.fromPredicate(
(xs: string) => xs.includes('@'),
() => ['Invalid email'],
);
const moreThan6Chars = E.fromPredicate(
(xs: string) => xs.length > 6,
() => ['Need more than 6 chars'],
);
const hasCapital = E.fromPredicate(
(xs: string) => /[A-Z]/.test(xs),
() => ['Need at least one capital letter'],
);
const hasNumber = E.fromPredicate(
(xs: string) => /\d/.test(xs),
() => ['Need at least one number'],
);
const validate = ({ username, email, password }: User) => pipe(
sequenceValidateE(
moreThan3Chars(username),
validateEmail(email),
moreThan6Chars(password),
hasCapital(password),
hasNumber(password),
),
E.map(([s]) => s),
);
在 sequenceValidateE
之中的所有驗證行為,都會是同時進行的,大家可以嘗試使用 Promise.all
來想像,所有的 Either<string[], B>
都會同時輸出驗證結果。
今天的主題在 should-i-use-fp-ts 在 src/day-22
並且有測試可以讓大家練習。