Effect-TS предоставляет мощные инструменты для обработки типов Option и Any. В этой статье мы рассмотрим различные способы преобразования этих типов и управления ими с помощью служебных функций библиотеки.
Функция O.getRight преобразует «Или» в вариант, отбрасывая ошибку. Если «Или» верно, возвращается O.some(value), в противном случае возвращается O.none.
import { Option as O, Either as E, pipe } from 'effect'; function conversions_ex01() { const eitherRight = E.right('ok'); // Create an Either containing the value 'ok' const eitherLeft = E.left('error'); // Create an Either representing an error console.log(O.getRight(eitherRight)); // Output: Some('ok') console.log(O.getRight(eitherLeft)); // Output: None }
Функция O.getLeft преобразует «Ибо» в «Параметры», отбрасывая значение. Если «Ибо» имеет значение «слева», возвращается O.some(error), в противном случае возвращается O.none.
import { Option as O, Either as E, pipe } from 'effect'; function conversions_ex02() { const eitherRight = E.right('ok'); // Create an Either containing the value 'ok' const eitherLeft = E.left('error'); // Create an Either representing an error console.log(O.getLeft(eitherRight)); // Output: None console.log(O.getLeft(eitherLeft)); // Output: Some('error') }
Функция O.getOrElse возвращает значение внутри Option, если оно имеет значение Some, в противном случае она возвращает предоставленное значение по умолчанию.
import { Option as O, pipe } from 'effect'; function conversions_ex03() { const some = O.some(1); // Create an Option containing the value 1 const none = O.none(); // Create an Option representing no value console.log( pipe( some, O.getOrElse(() => 'default') ) ); // Output: 1 (since some contains 1) console.log( pipe( none, O.getOrElse(() => 'default') ) ); // Output: 'default' (since none is None) }
Функция O.orElse возвращает предоставленный параметр: если self имеет значение None, в противном случае она возвращает self. Эта функция позволяет объединять опции в цепочку, где резервным вариантом является другой вариант.
import { Option as O, pipe } from 'effect'; function conversions_ex04() { const some1 = O.some(1); // Create an Option containing the value 1 const some2 = O.some(2); // Create an Option containing the value 2 const none = O.none(); // Create an Option representing no value console.log( pipe( some1, O.orElse(() => some2) ) ); // Output: Some(1) (since some1 contains 1) console.log( pipe( none, O.orElse(() => some2) ) ); // Output: Some(2) (since none is None and fallback is some2) }
Функция O.orElseSome возвращает предоставленное значение по умолчанию, заключенное в Some, если self равно None, в противном случае она возвращает self. Эта функция позволяет объединять параметры в цепочку, где резервным вариантом является значение по умолчанию, заключенное в Some.
import { Option as O, pipe } from 'effect'; function conversions_ex05() { const some = O.some(1); // Create an Option containing the value 1 const none = O.none(); // Create an Option representing no value console.log( pipe( some, O.orElseSome(() => 2) ) ); // Output: Some(1) (since some contains 1) console.log( pipe( none, O.orElseSome(() => 2) ) ); // Output: Some(2) (since none is None and fallback is 2) }
Функция O.orElseEither возвращает параметр, содержащий либо вариант, где Left — это резервный вариант, а Right — исходный вариант. Эта функция позволяет объединять варианты в цепочку, где запасной вариант предоставляет «Или» для большего контекста.
import { Option as O, Either as E, pipe } from 'effect'; function conversions_ex06() { const some1 = O.some(1); // Create an Option containing the value 1 const some2 = O.some(2); // Create an Option containing the value 2 const none = O.none(); // Create an Option representing no value console.log( pipe( some1, O.orElseEither(() => some2) ) ); // Output: Some(Right(1)) (since some1 contains 1) console.log( pipe( none, O.orElseEither(() => some2) ) ); // Output: Some(Left(2)) (since none is None and fallback is some2) }
Функция O.firstSomeOf возвращает первый Some, найденный в итерации Options. Если все имеют значение None, возвращается None.
import { Option as O } from 'effect'; function conversions_ex07() { const options = [O.none(), O.some(1), O.some(2)]; // Create an iterable of Options const optionsAllNone = [O.none(), O.none()]; // Create an iterable of None Options console.log(O.firstSomeOf(options)); // Output: Some(1) (since the first non-None Option is Some(1)) console.log(O.firstSomeOf(optionsAllNone)); // Output: None (since all Options are None) }
Функция O.toRefinement преобразует функцию, возвращающую параметр, в защиту типа, обеспечивая более конкретную проверку типа.
import { Option as O } from 'effect'; function conversions_ex08() { const isPositive = (n: number): O.Option=> n > 0 ? O.some(n) : O.none(); const isPositiveRefinement = O.toRefinement(isPositive); console.log(isPositiveRefinement(1)); // Output: true (since 1 is positive) console.log(isPositiveRefinement(-1)); // Output: false (since -1 is not positive) }
Функция O.toArray преобразует параметр Option в массив. Если параметр «Некоторые», он возвращает массив, содержащий значение; если оно равно None, возвращается пустой массив.
import { Option as O } from 'effect'; function conversions_ex09() { const some = O.some(1); // Create an Option containing the value 1 const none = O.none(); // Create an Option representing no value console.log(O.toArray(some)); // Output: [1] (since some contains 1) console.log(O.toArray(none)); // Output: [] (since none is None) }
В этой статье мы рассмотрели различные функции, предоставляемые Effect-TS для преобразования и управления типами Option и Once. Эти функции повышают гибкость и выразительность вашего кода, позволяя более изящно обрабатывать необязательные и подверженные ошибкам значения. Если вам нужно преобразовать «Ибо» в параметр, связать несколько значений параметра или выполнить типобезопасные операции, Effect-TS предлагает надежный набор инструментов для упрощения этих задач. Используя эти утилиты, вы можете писать более чистый и удобный в сопровождении код, который эффективно обрабатывает наличие или отсутствие значений.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3