diff --git a/src/index.d.ts b/src/index.d.ts index 41823ba..c166233 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -79,6 +79,13 @@ export type ProviderFn< ? (externalDeps?: ProviderFnArgs) => ModuleAPI : (externalDeps: ProviderFnArgs) => ModuleAPI; +/** + * Checks if each injectable match the required dependencies of the entire registry + */ +type ValidateRegistry> = { + [key in keyof Registry]: key extends keyof Deps ? ((deps?: any) => Deps[key]) | Deps[key] : Registry[key]; +}; + declare function valueFn(value: T): () => T; declare const provideSymbol: unique symbol; @@ -91,7 +98,7 @@ declare function createProvider< Registry extends ObjectLike, PublicAPI extends Array = [] >(args: { - injectables: Registry; + injectables: ValidateRegistry; api?: PublicAPI; }): ProviderFn; diff --git a/src/test.ts b/src/test.ts index 1508ad4..b0e38d5 100644 --- a/src/test.ts +++ b/src/test.ts @@ -203,31 +203,28 @@ createProvider: { }, })({}); - let someProvider = createProvider({ + createProvider({ injectables: { - a: ({ b }: { b: string }) => b, - b: () => 42, + foo: ({ a }: { a: number }) => a, + bar: ({ b }: { b: string }) => b, + // @ts-expect-error a is not a number + a: "42", + // @ts-expect-error b is not a string + b: () => 42 as number, }, - api: ['a'], + api: ['foo', 'bar'], }); - // @ts-expect-error - // b is not a number - someProvider(); - - let f = createProvider({ + createProvider({ injectables: { - a: ({ b }: { b: number }) => b, - c: ({ b }: { b: string }) => b, - b: 42, + a: ({ c }: { c: number }) => c, + b: ({ c }: { c: string }) => c, + // @ts-expect-error c does not satisfy a & b + c: 42, }, - api: ['a'], + api: ['a', 'c'], }); - // @ts-expect-error - // b can not be fulfilled - f(); - // when all dependencies are provide, external Deps is optional const provideFulfilled = createProvider({ injectables: { @@ -253,11 +250,20 @@ createProvider: { provideMissing(); // @ts-expect-error provideMissing({}); + + const provideWrongType = createProvider({ + injectables: { + foo: ({ val }: { val: number }) => val, + }, + api: ['foo'], + }); + // @ts-expect-error wrong dependency type + provideWrongType({ val: "42" }) } fromClass: { class Foo { - constructor({ b }: { b: string }) {} + constructor({ b }: { b: string }) { } } let factory = fromClass(Foo); factory({ b: 'woot' });