Neatly Prepared Mustache

    constructor-injection
    TypeScript icon, indicating that this package has built-in type declarations

    1.3.1 • Public • Published

    constructor-injection

    Build Status NPM version Dependencies Typescript

    Install

    npm install constructor-injection
    

    Example Usage

    Constructor Injection

    import { injectConstructor } from "constructor-injection";
     
    @Injectable() // from Inversify or Angular for example
    class ClassWithParameters {
        constructor(
            public readonly paramOne: string,
            public readonly paramTwo: number,
            public readonly paramThree: boolean) {
        }
    }
     
    const resolveParameter: ParameterProvider = (passedParameter: any, reflectMetadata: any, index: number) => {
        // Logic to provide correct parameter value
        // For example if inversify is your DI library:
        return passedParameter != null ? passedParameter : inversifyContainer.get(reflectMetadata);
    };
     
    const injectedConstructor = injectConstructor(ClassWithParameters, resolveParameter);
     
    const instance = new injectedConstructor();

    Function Injection

    A similar approach can be used to provide values for function parameters. Unfortunately the metadata for function parameters isn't currently available so we need to provide the metadata for the function parameters ourselves.

    import { injectFunction } from "constructor-injection";
     
    function functionWithParameters(
        paramOne: string,
        paramTwo: ClassWithNoParams,
        paramThree: ClassWithParameters): string {
        return "return value";
    }
     
    const resolveParameter: ParameterProvider = (passedParameter: any, reflectMetadata: any, index: number) => {
        // Logic to provide correct parameter value
        // For example if inversify is your DI library:
        return passedParameter != null ? passedParameter : inversifyContainer.get(reflectMetadata);
    };
     
    const injectedFunction = injectFunction( // typed as (paramOne?: string, paramTwo?: ClassWithNoParams, paramThree?: ClassWithParameters) => string
        functionWithParameters, 
        [ undefined, ClassWithNoParams, ClassWithParameters ], // provide types to inject 
        resolveParameter);
     
    injectedFunctions("stringValueThatCantBeInjected"); // call function

    Setup

    This package uses Reflect Metadata to inspect the constructor parameters of your class. To use this your tsconfig.json must contain:

    {
        "compilerOptions": {
            "experimentalDecorators": true,    
            "emitDecoratorMetadata": true      
        }
    }

    and the class that you are trying to construct MUST have a decorator to inform typescript that metadata should be saved:

    @Injectable()
    class ClassWithParameters {
        constructor(
            public readonly paramOne: string,
            public readonly paramTwo: number,
            public readonly paramThree: boolean) {
        }
    }

    you must also install and import reflect-metadata somwhere in your app - preferably as the first import.

    npm install reflect-metadata
    
    import "reflect-metadata";

    Minimum Typescript version: 3.5

    Keywords

    none

    Install

    npm i constructor-injection

    DownloadsWeekly Downloads

    0

    Version

    1.3.1

    License

    ISC

    Unpacked Size

    14.1 kB

    Total Files

    18

    Last publish

    Collaborators

    • roaders