type Instance = T extends new (...a: any) => infer I ? I : never type EventNames = { [K in keyof T]: K extends `add_${infer E}` ? `remove_${E}` extends keyof T ? E : never : never }[keyof T] type Handler = `add_${E}` extends keyof T ? T[`add_${E}`] extends (arg: infer A) => any ? A : never : never declare const onejs: { add_onReload(handler: () => void): void remove_onReload(handler: () => void): void add_onDispose(handler: () => void): void remove_onDispose(handler: () => void): void add_onError(handler: (ex: CS.System.Exception) => void): void remove_onError(handler: (ex: CS.System.Exception) => void): void // interop: { // TODO // classes: Record // objects: Record // } subscribe>( eventSource: T, eventName: K, handler: Function ): CS.System.Action subscribe< C extends new (...a: any) => any, I extends Instance, E extends EventNames >( eventSource: C, eventName: E, handler: Function ): CS.System.Action subscribe(eventName: string, handler: () => void): CS.System.Action teardown(action: CS.System.Action): void } declare function require(name: string): any declare const resource: CS.OneJS.Resource declare const ___workingDir: string