Это осложнение вызвано необходимостью переходить от одного к другому и к задаче, и между этими двумя типами нет естественного преобразования.Почему бы не использовать существующий тип taksEither?У fp ts очень плохие документы, поэтому я переписал твой код, используя другую библиотеку (от fluture js)
Вместо этого вот как это будет выглядеть при использовании fluturejs (по сути, задача + любая)
import * as Future from 'fluture';
const buildPerson = (name, age) =>
name !== undefined && age !== undefined
? Future.of({ name, age })
: Future.reject(Error("Missing parameter"));
const validatePerson = ({ name, age }) =>
age < 18
? Future.reject(Error("Too Young"))
: Future.of({ name, age });
const getNameFromRepo = (repo: Repo) => {
return Future.Future((reject, resolve) =>
resolve(repo.getName()));
}
const getAgeFromRepo = (repo: Repo) => {
return Future.Future((reject, resolve) =>
resolve(repo.getAge()));
}
const savePerson = (repo: Repo) => (person) => {
return Future.Future((reject, resolve) =>
resolve(repo.setPerson(person)));
}
const hello = (repo: Repo) =>
Future.parallel(1, [
getNameFromRepo(repo),
getAgeFromRepo(repo),
])
.chain(([name, age]) => buildPerson(name, age))
.chain(validatePerson)
.chain(savePerson(repo))
.fork(
(err) => console.warn('err', err),
() => console.log('it worked!'),
);
hello(new Repo());
Я не смог отсканировать документы и выяснить, как эти функции называются в реализации fp-ts, но я уверен, что все они существуют.Параллельная функция Flutures берет список Futures и возвращает будущее списка, это поведение по существу конкатное и должно существовать в задании fp-ts, потому что его необходимо реализовать на монадах
Далее, если вы перепроектировали репокласс и его методы возвращают taskeithers, вы еще больше упростите свой код.