Skip to content

Commit fa5ee4b

Browse files
mayorandrewnicojs
andauthored
simplify context type (#66)
Allow for near-infinite deep dependency trees. Co-authored-by: Nico Jansen <jansennico@gmail.com>
1 parent 028cd45 commit fa5ee4b

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

src/api/TChildContext.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
// Forces typescript to explicitly calculate the complicated type
2+
export type Simplify<T> = {} & { [K in keyof T]: T[K] };
3+
14
export type TChildContext<
25
TParentContext,
36
TProvided,
47
CurrentToken extends string,
5-
> = {
6-
[K in keyof (TParentContext & {
7-
[K in CurrentToken]: TProvided;
8-
})]: K extends CurrentToken
8+
> = Simplify<{
9+
[K in keyof TParentContext | CurrentToken]: K extends CurrentToken //
910
? TProvided
1011
: K extends keyof TParentContext
1112
? TParentContext[K]
1213
: never;
13-
};
14+
}>;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// error: false
2+
import { createInjector, tokens } from '../src/index.js';
3+
4+
const rootInjector = createInjector();
5+
6+
class Foo {
7+
constructor(public qux: boolean) {}
8+
public static inject = tokens('qux');
9+
}
10+
11+
const fooInjector = rootInjector
12+
.provideValue('qux', true)
13+
.provideClass('foo1', Foo)
14+
.provideClass('foo2', Foo)
15+
.provideClass('foo3', Foo)
16+
.provideClass('foo4', Foo)
17+
.provideClass('foo5', Foo)
18+
.provideClass('foo6', Foo)
19+
.provideClass('foo7', Foo)
20+
.provideClass('foo8', Foo)
21+
.provideClass('foo9', Foo)
22+
.provideClass('foo10', Foo)
23+
.provideClass('foo11', Foo)
24+
.provideClass('foo12', Foo)
25+
.provideClass('foo13', Foo)
26+
.provideClass('foo14', Foo)
27+
.provideClass('foo15', Foo)
28+
.provideClass('foo16', Foo)
29+
.provideClass('foo17', Foo)
30+
.provideClass('foo18', Foo)
31+
.provideClass('foo19', Foo)
32+
.provideClass('foo20', Foo)
33+
.provideClass('foo21', Foo)
34+
.provideClass('foo22', Foo)
35+
.provideClass('foo23', Foo)
36+
.provideClass('foo24', Foo)
37+
.provideClass('foo25', Foo)
38+
.provideClass('foo26', Foo)
39+
.provideClass('foo27', Foo)
40+
.provideClass('foo28', Foo)
41+
.provideClass('foo29', Foo)
42+
.provideClass('foo30', Foo)
43+
.provideClass('foo41', Foo)
44+
.provideClass('foo42', Foo)
45+
.provideClass('foo43', Foo)
46+
.provideClass('foo44', Foo)
47+
.provideClass('foo45', Foo)
48+
.provideClass('foo46', Foo)
49+
.provideClass('foo47', Foo)
50+
.provideClass('foo48', Foo)
51+
.provideClass('foo49', Foo)
52+
.provideClass('foo50', Foo);
53+
54+
const foo = fooInjector.resolve('foo50');

testResources/tokens-of-type-string.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// error: "Type 'string[]' is not assignable to type 'readonly InjectionToken<TChildContext<{}, number, \"bar\">>[]'"
1+
// error: "Type 'string[]' is not assignable to type 'readonly InjectionToken<{ bar: number; }>[]'"
22

33
import { createInjector } from '../src/index.js';
44

0 commit comments

Comments
 (0)