TGViewer
Khraks dev Khraks dev @khraks_dev · 108 subscribers
Post #46 227
#DI как в Effect Pt2
Получаем вот что:

const program: Computation<void, { logger: Logger, random: Random }> = andThan(getRandom)(logNumber)

const runnable = provideServices(program)({ logger: ConsoleLogger, random: MathRandom })

run(runnable) // OK

Можно заметить что мы заранее декларировали сервисы функкий в типах. Можно сделать более интересно — как yield* MyServiceTag в Effect. Чтобы мы его просто читали и он сам проставлялся в зависимости функции! Получается мы хотим сделать такую функицю которая бы на вход принимала какой-то сервис и тут же бы возвращала его обратно в качестве результата вычисления — для дальнейшего использования

const tag = <Service extends {}>(): Reader<Service, Service> => {
return (service) => service;
};

Соберем теперь все вместе

const RandomTag = tag<{ random: Random }>();
const LoggerTag = tag<{ logger: ConsoleLogger }>();

const getRandom = flatMap(RandomTag)(
(services) => sync(() => services.random.random() ** 2),
);
const logNumber = (num: number) =>
flatMap(LoggerTag)((services) => sync(() => services.logger.log(num)));

const program = flatMap(getRnd)(logRnd);

const withConsole = provide(program)({
logger: ConsoleLogger,
});

const runnable = provide(withConsole)({
random: MathRandom,
});

run(program); // error
run(withConsole); // error
run(runnable); // ok

Вообще это подход к организации DI например в fp-ts. Там и в Haskell этот тип Computation<> наызвается Reader. Так что идея не нова. В том же Effect под капотом Context та же мапка но на уровне типов зависимости трекаются через тип сумму |, а не произведение &. В начальных версиях было через & но от этого ушли из-за проблем с ts.
Так что если нужен Effect-like DI — посмотрите на семейство модулей Reader fp-ts.
Песочница https://tsplay.dev/NBOazm

А вы какой DI используете?
www.typescriptlang.org TS Playground - An online editor for exploring TypeScript and JavaScript The Playground lets you write TypeScript or JavaScript online in a safe and sharable way.
  • 👍 4
More from @khraks_dev
  1. Sep 10, 2026Добавил еще PR с Context.Mixin, чтобы подмешивать к классу поведение Context.Service Тепер…
  2. Sep 10, 2026Post #56
  3. Sep 7, 2026Post #55
  4. Sep 3, 2026Post #54
  5. Sep 3, 2026Итак HKT на основе TypeLambda interface TypeLambda { readonly Arg1: unknown; readonly Arg2…
  6. Aug 30, 2026# HKT Дефункционализация В TypeScript нет настоящих Higher-Kinded Types (HKT). А они приме…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →