Skip to content

Commit 5b2c728

Browse files
authored
Fix published provideClass return type inference. (#14)
Without the type assertion, compiler resulting npm package type definition for `provideClass` looks like: ``` providesClass: <Token extends TokenType, Service, Tokens extends readonly ValidTokens<Services>[]>(token: Token, cls: InjectableClass<Services, Service, Tokens>) => Container<AddService<Services, Token, import("./Injectable").ConstructorReturnType<InjectableClass<Services, Service, Tokens>>>>; ``` The last bit (`ConstructorReturnType<InjectableClass<Services, Service, Tokens>>>>`) is somehow problematic. Resolving types for services provided using the function breaks, e.g. `container.providesClass('serivice', Service)` returns a container of type `Container<{ service: any }>`. The fix addresses the issue by asserting the function's return type, so the generated function signature looks like: ``` providesClass: <Token extends TokenType, Service, Tokens extends readonly ValidTokens<Services>[]>(token: Token, cls: InjectableClass<Services, Service, Tokens>) => Container<AddService<Services, Token, Service>>; ``` With that `container.providesClass('serivice', Service)` correctly returns a container of type `Container<{ service: Service }>`.
1 parent 44b4588 commit 5b2c728

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@snap/ts-inject",
3-
"version": "0.3.1",
3+
"version": "0.3.2",
44
"description": "100% typesafe dependency injection framework for TypeScript projects",
55
"license": "MIT",
66
"author": "Snap Inc.",

src/Container.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,8 @@ export class Container<Services = {}> {
421421
providesClass = <Token extends TokenType, Service, Tokens extends readonly ValidTokens<Services>[]>(
422422
token: Token,
423423
cls: InjectableClass<Services, Service, Tokens>
424-
) => this.providesService(ClassInjectable(token, cls));
424+
): Container<AddService<Services, Token, Service>> =>
425+
this.providesService(ClassInjectable(token, cls)) as Container<AddService<Services, Token, Service>>;
425426

426427
/**
427428
* Registers a static value as a service in the container. This method is ideal for services that do not
@@ -433,8 +434,10 @@ export class Container<Services = {}> {
433434
* @returns A new Container instance that includes the provided service, allowing for chaining additional
434435
* `provides` calls.
435436
*/
436-
providesValue = <Token extends TokenType, Service>(token: Token, value: Service) =>
437-
this.providesService(Injectable(token, [], () => value));
437+
providesValue = <Token extends TokenType, Service>(
438+
token: Token,
439+
value: Service
440+
): Container<AddService<Services, Token, Service>> => this.providesService(Injectable(token, [], () => value));
438441

439442
/**
440443
* Appends a value to the array associated with a specified token in the current Container, then returns
@@ -455,7 +458,7 @@ export class Container<Services = {}> {
455458
appendValue = <Token extends keyof Services, Service extends ArrayElement<Services[Token]>>(
456459
token: Token,
457460
value: Service
458-
) => this.providesService(ConcatInjectable(token, () => value)) as Container<Services>;
461+
): Container<Services> => this.providesService(ConcatInjectable(token, () => value)) as Container<Services>;
459462

460463
/**
461464
* Appends an injectable class factory to the array associated with a specified token in the current Container,
@@ -479,7 +482,7 @@ export class Container<Services = {}> {
479482
>(
480483
token: Token,
481484
cls: InjectableClass<Services, Service, Tokens>
482-
) =>
485+
): Container<Services> =>
483486
this.providesService(
484487
ConcatInjectable(token, () => this.providesClass(token, cls).get(token))
485488
) as Container<Services>;
@@ -507,7 +510,7 @@ export class Container<Services = {}> {
507510
Service extends ArrayElement<Services[Token]>,
508511
>(
509512
fn: InjectableFunction<Services, Tokens, Token, Service>
510-
) =>
513+
): Container<Services> =>
511514
this.providesService(
512515
ConcatInjectable(fn.token, () => this.providesService(fn).get(fn.token))
513516
) as Container<Services>;

0 commit comments

Comments
 (0)