33export type ContainerKey = string | symbol
44
55/**
6- *
6+ * Represents a dependency factory: a function that, given an IoC container, it
7+ * is able to instantiate a specific dependency.
78 */
89export type DependencyFactory <
910 T ,
10- TContainer extends Container < Record < ContainerKey , unknown > > ,
11+ TContainer extends ReadableContainer < Record < ContainerKey , unknown > > ,
1112> = ( container : TContainer ) => T | Promise < T >
1213
1314/**
14- *
15+ * Represents a read-only version of a type-safe IoC container with "auto-wired"
16+ * dependencies resolution.
1517 */
16- export interface Container <
18+ export interface ReadableContainer <
1719 TDependencies extends Record < ContainerKey , unknown > ,
1820> {
1921 /**
20- * Register a new dependency.
22+ * Resolve a dependency from the container.
23+ *
24+ * @param name The "name" of the dependency (can be a symbol).
25+ */
26+ resolve < TName extends keyof TDependencies > (
27+ name : TName ,
28+ ) : Promise < TDependencies [ TName ] >
29+ }
30+
31+ /**
32+ * Represents a write-only version of a type-safe IoC container with
33+ * "auto-wired" dependencies resolution.
34+ */
35+ export interface WritableContainer <
36+ TDependencies extends Record < ContainerKey , unknown > ,
37+ > {
38+ /**
39+ * Register a new dependency factory.
2140 *
2241 * @param name The "name" of the dependency (can be a symbol).
2342 * @param dependency A dependency factory.
2443 */
2544 register < TName extends ContainerKey , TDependency > (
2645 name : TName ,
27- dependency : DependencyFactory < TDependency , Container < TDependencies > > ,
46+ dependency : DependencyFactory <
47+ TDependency ,
48+ ReadableContainer < TDependencies >
49+ > ,
2850 ) : Container < {
2951 [ TK in keyof TDependencies | TName ] : TK extends keyof TDependencies
3052 ? TName extends TK
@@ -33,6 +55,12 @@ export interface Container<
3355 : TDependency
3456 } >
3557
58+ /**
59+ * Register an already instantiated dependency.
60+ *
61+ * @param name The "name" of the dependency (can be a symbol).
62+ * @param dependency An already instantiated value.
63+ */
3664 registerValue < TName extends ContainerKey , TDependency > (
3765 name : TName ,
3866 dependency : TDependency ,
@@ -43,19 +71,18 @@ export interface Container<
4371 : TDependencies [ TK ]
4472 : TDependency
4573 } >
46-
47- /**
48- * Resolve a dependency from the container.
49- *
50- * @param name The "name" of the dependency (can be a symbol).
51- */
52- resolve < TName extends keyof TDependencies > (
53- name : TName ,
54- ) : Promise < TDependencies [ TName ] >
5574}
5675
5776/**
58- *
77+ * Represents a type-safe IoC container with "auto-wired" dependencies
78+ * resolution
79+ */
80+ export interface Container < TDependencies extends Record < ContainerKey , unknown > >
81+ extends ReadableContainer < TDependencies > ,
82+ WritableContainer < TDependencies > { }
83+
84+ /**
85+ * Creates a new type-safe IoC container.
5986 */
6087export function createContainer ( ) : Container < { } > {
6188 return __createContainer ( { } )
0 commit comments