diff --git a/src/logger.test.ts b/src/logger.test.ts index 1c904cd..d718f80 100644 --- a/src/logger.test.ts +++ b/src/logger.test.ts @@ -411,3 +411,16 @@ function testNormalizeError(stringifiedError: string) { name: 'TypeError', }); } + +test.skip('type checking', () => { + expect(true).toBe(true); + + const lc = new OptionalLoggerImpl(consoleLogSink, 'debug', {foo: 'bar'}); + const {debug} = lc; + + // @ts-expect-error Should not allow extracted method. + debug?.('a'); + + // OK + debug?.call(lc, 'a'); +}); diff --git a/src/logger.ts b/src/logger.ts index 54bab83..9bb84ab 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -11,11 +11,19 @@ export interface OptionalLogger< Info extends unknown[] = unknown[], Debug extends unknown[] = unknown[], > { - error?: ((...args: Error) => void) | undefined; - info?: ((...args: Info) => void) | undefined; - warn?: ((...args: Warn) => void) | undefined; - debug?: ((...args: Debug) => void) | undefined; - flush?: (() => Promise) | undefined; + error?: + | ((this: OptionalLogger, ...args: Error) => void) + | undefined; + info?: + | ((this: OptionalLogger, ...args: Info) => void) + | undefined; + warn?: + | ((this: OptionalLogger, ...args: Warn) => void) + | undefined; + debug?: + | ((this: OptionalLogger, ...args: Debug) => void) + | undefined; + flush?(this: OptionalLogger): Promise; } /** @@ -82,11 +90,21 @@ export class OptionalLoggerImpl< Info extends unknown[] = unknown[], Debug extends unknown[] = unknown[], > implements OptionalLogger { - readonly debug?: ((...args: Debug) => void) | undefined = undefined; - readonly info?: ((...args: Info) => void) | undefined = undefined; - readonly warn?: ((...args: Warn) => void) | undefined = undefined; - readonly error?: ((...args: Error) => void) | undefined = undefined; - readonly flush: () => Promise; + readonly debug?: + | ((this: OptionalLogger, ...args: Debug) => void) + | undefined = undefined; + readonly info?: + | ((this: OptionalLogger, ...args: Info) => void) + | undefined = undefined; + readonly warn?: + | ((this: OptionalLogger, ...args: Warn) => void) + | undefined = undefined; + readonly error?: + | ((this: OptionalLogger, ...args: Error) => void) + | undefined = undefined; + readonly flush: ( + this: OptionalLogger, + ) => Promise; readonly #logSink: LogSink; readonly #context: Context | undefined;