GOOGLE ADS

среда, 27 апреля 2022 г.

Как ввести функцию ramda ifElse в машинописном тексте?

Я пытался улучшить ввод ifElse в ramda, который в настоящее время имеет печальный тип
export function ifElse(fn: Pred, onTrue: Arity2Fn, onFalse: Arity2Fn): Arity2Fn;

Однако я очень быстро достиг предела машинописного текста (читай: своих навыков), когда пытался его улучшить:

type Pred = <T>(o: T) => boolean
type Branch = <T>(o: T) => any
type Prop = <T, K extends keyof T>(k: K) => (o: T) => T[K]
type IfElseBase = (p: Pred, t: Branch, f: Branch) => (obj: any) => any
type IfElse = IfElseBase extends (
(p: (obj: any) => infer RP, t: (obj: any) => infer RT, f: (obj: any) => infer RF) => (obj: infer OBJ) => any)
? (p: (o: OBJ) => RP, t: (o: OBJ) => RT, f: (o: OBJ) => RF) => (o: OBJ) => RP extends true? RT: RF
: IfElseBase

// who cares about the real code, anyway?
const ifElse: IfElse = null as any
const prop: Prop = null as any
const propEq: <T, K extends keyof T>(key: K, val: T[K]) => (obj: T) => boolean = (k, v) => (o) => o[k] === v
type Test = {
flag: boolean
right: "ok",
wrong: "urgs"
}
const input: Test = {
flag: true,
right: "ok",
wrong: "urgs"
}
const output = ifElse(propEq("flag", true), prop("right"), prop("wrong"))(input) // any but should be "ok"

как игровая площадка


Решение проблемы

Лучший вариант, который мне удалось реализовать, — не использовать условные функции ramda. Например, вместо when(is(String), pipe(split('/'), last))in pipe я был вынужден использовать

pipe(
(maybeLink) => is(String, maybeLink)? last(split('/', maybeLink)): maybeLink,
...
)

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...