declare class myTestClass {
    /**
     * My test class
     */
    constructor();

    /**
     * A simple number member
     */
    myNumberMember: number | string;

    /**
     * A simple function
     */
    mySimpleFunction(): void;

}

declare class classWithPrivateMembers {
    /**
     * A class with a private members
     */
    constructor();

}

declare namespace myModule {
    namespace myModule_Namespace1 {
        /**
         * Stupid enum member
         */
        enum myStupidEnum {
            /**
             * Stupid enum value 1
             */
            VAL1 = "VAL1",
            /**
             * Stupid enum value 2
             */
            VAL2 = "VAL2",
        }

        /**
         * Executes some fancy commands
         * @param param1 Some string parameter
         * @param param2 Some string array
         * @param param3 fgfg
         * @returns a fancy object
         */
        function function1(param1: string | object, param2: string[], param3: DocFile): object;

        /**
         * A realy cool object
         */
        interface myRealyCoolObject {
            /**
             * property
             */
            A: string;
            /**
             * Property, yeah
             */
            B: someOtherObject;
        }

        /**
         * My other object
         */
        interface someOtherObject {
            /**
             * Some property
             */
            heyho: boolean;
        }

    }

    namespace myModule_Namespace2 {
        /**
         * Destroys your system
         * @param param1 A simple string param
         * @param param2 A object param
         * @returns A funny joke about you
         */
        function function1(param1: string, param2: object): string;

        /**
         * A simple function
         */
        function function2(): void;

        /**
         * A function with multiple return values
         * @returns
         */
        function function3(): string | boolean;

    }

}

declare module 'myModule2' {
    /**
     * exported function
     * @param myString
     * @param myCallback
     */
    function myFunction1(myString: string, myCallback: testCallback): void;

    /**
     * exported callback
     * @param testCBParam
     */
    type testCallback = (testCBParam: string)=>void;

    /**
     * inner function
     * @param myString
     */
    function myFunction2(myString: string): void;

}

declare module 'myModule3' {
    /**
     * exported function
     * @param param1
     */
    function myFunction1(param1: string): string;

    /**
     * inner function
     * @param param2
     */
    function myFunction2(param2: string): void;

}

