Типизация result
Opened this issue · 0 comments
pongo commented
fatmotorbot/src/shared/utils/result.ts
Line 43 in 0a9e2c8
заменить на 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>);
}