# HG changeset patch # User cin # Date 2023-02-21 22:49:42 # Node ID 58282d42a47b06e0e30faa0d72e9aea86e696bca # Parent 5683fe88e2a507228e588a0528dfd2c99df609fc improved typings diff --git a/src/main/ts/interfaces.ts b/src/main/ts/interfaces.ts --- a/src/main/ts/interfaces.ts +++ b/src/main/ts/interfaces.ts @@ -27,12 +27,26 @@ export interface Resolver(name: K, opts?: O): (O extends { default: infer T } ? T : never) | NonNullable; } -export type DepsMap = { [k in K]: SK | Ref }; +export type DepsMap = { + [k in key]: Refs +}; + +export type Refs = { + [k in keyof S]: Ref; +}[keyof S] | keyof S; + +export type Ref = { name: K, lazy?: L, default?: D | null }; -export type Ref = { name: K, lazy?: L } | { name: K, lazy?: L, default: D }; +export type Lazy = L extends true ? () => T : T; + +export type InferDefault = T extends { default: infer D } ? D : never; -export type Resolved = - L extends true ? () => NonNullable | (unknown extends D ? never : D) : NonNullable | (unknown extends D ? never : D); +export type Resolve = + R extends keyof S ? NonNullable : + R extends Ref ? + K extends keyof S ? Lazy | InferDefault, L> : + never: + never; export interface IDescriptorBuilder { @@ -42,12 +56,9 @@ export interface IDescriptorBuilder T): void; - wants, keyof S>>(refs: X): + wants & Record>(refs: X): IDescriptorBuilder : - X[k] extends Ref ? Resolved : - never + [k in keyof X]: Resolve; }, O> override(name: K, builder: RegistrationBuilder>): this; diff --git a/src/test/ts/t/container.ts b/src/test/ts/t/container.ts --- a/src/test/ts/t/container.ts +++ b/src/test/ts/t/container.ts @@ -1,7 +1,7 @@ /* eslint max-classes-per-file: ["error", 20] */ import { describe, it } from "mocha"; import { Container } from "../Container"; -import { ContainerServices } from "../interfaces"; +import { ContainerServices, DepsMap, Refs, Resolver } from "../interfaces"; import { fluent } from "../traits"; class Foo { @@ -31,6 +31,19 @@ interface ServicesB { zoo?: Foo; } +declare const resolver: Resolver; + +const foo = resolver("foo", {lazy: true}); + +const mmap = >(m: X) => {}; + +const refs: Refs = {name: "bar", default: undefined}; + +mmap({ + fooz: {name: "foo", lazy: false, default: undefined }, + ooz: "bar" +}); + interface SharedServices { foo: Foo; @@ -47,13 +60,17 @@ const config = fluent() .lifetime("context") // тип активации, время жизни .wants({ zoo: "zoo", // зависимость + bar: "bar", - zoo$: { name: "zoo", lazy: true } // отложенная активация, + $zoo: { name: "foo", lazy: true, } // отложенная активация, //фабричный метод }) - .factory(({ zoo$ }) => // фабрика получает объект с именованными зависимостями + .wants({ + zoom: "bar" + }) + .factory(({ $zoo, zoo }) => // фабрика получает объект с именованными зависимостями // удобно для деструктурирования - new Bar(zoo$) // создается экземпляр сервиса + new Bar($zoo) // создается экземпляр сервиса ), foo: it => it.factory(() => new Foo()), baz: it => it.value(new Foo())