I have a home-brew JavaScript library (one js file) that contains a number of classes. In order to use it in my TypeScript projects, I have created a d.ts file that contains type definitions for all those classes. A typical definition would look like this:
export interface ClassExample {
new(param: boolean): ClassExample;
propertyName: number|string;
log(...args: any[]): void;
}
And it works well. But I am getting bashed by linter rule @typescript-eslint/no-misused-new: "Interfaces cannot be constructed, only classes". Of course, I can configure my linter and/or add exceptions for the particular d.ts file, but this makes me contemplate if there should be some other approach to describe my classes. Should an abstract class declaration be used instead? I tried to look up how the class constructors are declared for publicly available Node.js modules, and found this code in @types/node/console.d.ts file:
interface ConsoleConstructor {
prototype: Console;
new(stdout: WritableStream, stderr?: WritableStream, ignoreErrors?: boolean): Console;
new(options: ConsoleConstructorOptions): Console;
}
So, I figure, declaring class constructors in interface is not a grave sin, if the authors of Node.js are practicing it?