pongo/fatmotorbot

Типизация result

Opened this issue · 0 comments

pongo commented

type OksOfT<T extends unknown[]> = { [P in keyof T]: Ok<T[P]> };

заменить на type OksOfT<T extends unknown[]> = { [P in keyof T]: T[P] extends Result<infer U> ? Ok<U> : never };


type OksOfT<T extends unknown[]> = { [P in keyof T]: T[P] extends Result<infer U> ? Ok<U> : never };
type ValuesOf<T extends unknown[]> = { [P in keyof T]: T[P] extends Ok<infer U> ? U : never };

function comb2<T1, T2>(results: [Result<T1>, Result<T2>]) {
  for (const result of results) {
    if (result.isErr) return result;
  }
  const oks = results as OksOfT<typeof results>;
  const values = oks.map(x => x.value);
  return ok(values as ValuesOf<typeof oks>);
}

посмотреть как типизирован Promise.all https://github.com/microsoft/TypeScript/blob/master/lib/lib.es2015.promise.d.ts


кажется рабочее Playground Link

type OksTupleOfT<T extends Result<unknown>[]> = { [P in keyof T]: T[P] extends Result<infer O, infer _> ? O : never }
type ErrsUnionOfT<T extends Result<unknown>[]> = T extends Array<infer R> ? R extends Err<infer E> ? E : never : never

function combine<T extends Result<unknown>[]>(...results: T): Result<OksTupleOfT<T>, ErrsUnionOfT<T>> {
  for (const result of results) {
    if (result.isErr) return result as Err<ErrsUnionOfT<T>>;
  }
  return ok((results as Ok<unknown>[]).map(x => x.value) as OksTupleOfT<T>);
}