Skip to content

Instantly share code, notes, and snippets.

@nicojs
Created January 15, 2019 14:45
Show Gist options
  • Save nicojs/679f940d50fbc172e531dbd32f63f7f7 to your computer and use it in GitHub Desktop.
Save nicojs/679f940d50fbc172e531dbd32f63f7f7 to your computer and use it in GitHub Desktop.
interface Injectable<TContext, Tokens extends (keyof TContext)[], R> {
new(...args: CorrespondingTypes<TContext, Tokens>): R;
inject: Tokens;
}
type CorrespondingTypes<TContext, Tokens extends (keyof TContext)[]> = {
[Token in keyof Tokens]: Tokens[Token] extends keyof TContext ? TContext[Tokens[Token]] : never;
}
class Injector<TContext> {
inject<Tokens extends (keyof TContext)[]>(injectable: Injectable<TContext, Tokens, R>): R {
/* out of scope */
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment