interfaces.ts
143 lines
| 5.9 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r4 | import { key } from "./traits"; | ||
|
|
r1 | |||
|
|
r0 | export interface IDestroyable { | ||
| destroy(): void; | ||||
| } | ||||
|
|
r1 | /** | ||
| * @template S Карта доступных зависимостей | ||||
| */ | ||||
|
|
r0 | export interface Resolver<S extends object> { | ||
|
|
r1 | /** | ||
| * Функция для разрешения зависимостей, поддерживает создание фабричных методов, | ||||
| * отложенную активацию и значение по-умолчанию для сервисов | ||||
| * @template K Ключ сервиса из {@link S} | ||||
| * @template O Тип параметра {@link opts} используется для выведения типа | ||||
| * возвращаемого значения. | ||||
| * @param name Ключ сервиса, который будет разрешен. | ||||
| * @param {boolean=} opts.lazy Признак того, что требуется отложенная активация, | ||||
| * будет возвращен фабричный метод для получения зависимости. Если не указан, | ||||
| * то считается `false`. | ||||
| * @param {any=} opts.default Значение по умолчанию, если в контейнере указанный | ||||
| * сервис не зарегистрирован | ||||
| * @returns Либо фабричный метод для получения зависимости, либо значение зависимости | ||||
| * @throws Error Если зависимость не найдена и не предоставлено значение по-умолчанию | ||||
| */ | ||||
| <K extends keyof S, O extends { lazy: true; default?: unknown }>(name: K, opts?: O): () => (O extends { default: infer T } ? T : never) | NonNullable<S[K]>; | ||||
| <K extends keyof S, O extends { lazy?: false; default?: unknown }>(name: K, opts?: O): (O extends { default: infer T } ? T : never) | NonNullable<S[K]>; | ||||
|
|
r0 | } | ||
|
|
r4 | export type DepsMap<K extends key, SK extends key> = { [k in K]: SK | Ref<SK, boolean, unknown> }; | ||
|
|
r5 | export type Ref<K extends key, L extends boolean, D> = { name: K, lazy?: L } | { name: K, lazy?: L, default: D }; | ||
|
|
r4 | |||
| export type Resolved<S, K extends keyof S, L, D> = | ||||
|
|
r5 | L extends true ? () => NonNullable<S[K]> | (unknown extends D ? never : D) : NonNullable<S[K]> | (unknown extends D ? never : D); | ||
|
|
r4 | |||
|
|
r6 | export interface IDescriptorBuilder<S extends object, T, R extends object, O extends keyof S> { | ||
|
|
r1 | |||
| /** | ||||
| * | ||||
| * @param f | ||||
| */ | ||||
|
|
r4 | factory(f: (refs: R) => T): void; | ||
| wants<X extends DepsMap<Exclude<key, keyof R>, keyof S>>(refs: X): | ||||
| IDescriptorBuilder<S, T, R & { | ||||
| [k in keyof X]: | ||||
| X[k] extends keyof S ? NonNullable<S[X[k]]> : | ||||
|
|
r5 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : | ||
|
|
r4 | never | ||
|
|
r6 | }, O> | ||
|
|
r0 | |||
|
|
r6 | override<K extends O>(name: K, builder: RegistrationBuilder<S, NonNullable<S[K]>>): this; | ||
| override<K extends O>(services: { [name in K]: RegistrationBuilder<S, NonNullable<S[K]>> }): this; | ||||
|
|
r0 | |||
|
|
r1 | lifetime(lifetime: "singleton", typeId: string | number | object): this; | ||
| lifetime(lifetime: ILifetime<T> | Exclude<ActivationType, "singleton">): this; | ||||
|
|
r0 | |||
| cleanup(cb: (item: T) => void): this; | ||||
| value(v: T): void; | ||||
| } | ||||
|
|
r6 | export type RegistrationBuilder<S extends object, T> = (d: IDescriptorBuilder<S, T, object, ConfigurableKeys<S>>) => void; | ||
|
|
r0 | |||
|
|
r6 | export type RegistrationBuildersMap<S extends Configurable<S>, K extends keyof S = keyof S> = { | ||
|
|
r5 | [k in K]-?: RegistrationBuilder<ContainerServices<S>, NonNullable<S[k]>> | ||
|
|
r1 | }; | ||
|
|
r0 | |||
|
|
r1 | export interface Descriptor<S extends object, T> { | ||
|
|
r5 | activate(context: IActivationContext<S>): T; | ||
|
|
r0 | } | ||
|
|
r5 | export interface IActivationContext<S extends object> extends ServiceLocator<S> { | ||
| createLifetime<T>(): ILifetime<T>; | ||||
| createContainerLifetime<T>(): ILifetime<T>; | ||||
| } | ||||
|
|
r1 | export type RegistrationMap<S extends object, K extends keyof S = keyof S> = { | ||
| [k in K]-?: Descriptor<S, S[k]>; | ||||
|
|
r0 | }; | ||
|
|
r5 | export interface ContainerProvided<S extends Configurable<S>> { | ||
|
|
r1 | container: ServiceLocator<ContainerServices<S>>; | ||
|
|
r5 | childContainer: IContainerBuilder<S>; | ||
|
|
r1 | } | ||
|
|
r5 | export type Configurable<S> = { [k in keyof S & (keyof ContainerProvided<never>)]: never; }; | ||
|
|
r1 | |||
|
|
r5 | export type ProvidedKeys = keyof ContainerProvided<never>; | ||
|
|
r1 | |||
|
|
r5 | export type ContainerServices<S extends Configurable<S>> = S & ContainerProvided<S>; | ||
|
|
r1 | |||
| export type ConfigurableKeys<S extends object> = Exclude<keyof S, ProvidedKeys>; | ||||
| export type ConfigurableServices<S extends object> = Pick<S, ConfigurableKeys<S>>; | ||||
|
|
r0 | |||
|
|
r5 | export type ContainerKeys<S extends Configurable<S>> = keyof S | keyof ContainerProvided<never>; | ||
|
|
r0 | export interface ServiceLocator<S extends object> { | ||
|
|
r1 | resolve<K extends keyof S>(name: K): NonNullable<S[K]>; | ||
| resolve<K extends keyof S, T>(name: K, def: T): NonNullable<S[K]> | T; | ||||
|
|
r0 | } | ||
|
|
r1 | export interface LifetimeContainer { | ||
| createLifetime<T>(): ILifetime<T>; | ||||
| } | ||||
|
|
r5 | export interface ServiceContainer<S extends Configurable<S>> extends | ||
| ServiceLocator<ContainerServices<S>>, | ||||
| IDestroyable { | ||||
|
|
r1 | |||
|
|
r5 | createChildContainer(): IContainerBuilder<S>; | ||
| } | ||||
|
|
r0 | |||
|
|
r5 | export interface IContainerBuilder<S extends Configurable<S>> { | ||
|
|
r6 | createServiceBuilder<K extends keyof S>(name: K): IDescriptorBuilder<S, NonNullable<S[K]>, object, keyof S>; | ||
|
|
r5 | |||
| build(): ServiceContainer<S>; | ||||
|
|
r0 | } | ||
| export type ActivationType = "singleton" | "container" | "hierarchy" | "context" | "call"; | ||||
| /** | ||||
| * Интерфейс для управления жизнью экземпляра объекта. Каждая регистрация имеет | ||||
| * свой собственный объект `ILifetime`, который создается при первой активации | ||||
| */ | ||||
|
|
r1 | export interface ILifetime<T> { | ||
|
|
r0 | /** Проверяет, что уже создан экземпляр объекта */ | ||
| has(): boolean; | ||||
|
|
r1 | get(): T; | ||
|
|
r5 | initialize(context: IActivationContext<object>): void; | ||
|
|
r0 | |||
|
|
r1 | store(item: T, cleanup?: (item: T) => void): void; | ||
| } | ||||
|
|
r0 | |||
|
|
r2 | export type ExtractRequired<T, K extends keyof T = keyof T> = { [p in K as (undefined extends T[p] ? never : p)]-?: T[p] }; | ||
|
|
r1 | |||
