最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - TypeScript type definitions: how to declare class constructors - Stack Overflow

programmeradmin2浏览0评论

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?

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?

Share Improve this question asked Feb 10, 2021 at 11:08 PassidayPassiday 8,10511 gold badges45 silver badges65 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 8

According to the handbook, you'd declare that class with the declare keyword, like this:

declare class ClassExample {
    constructor(param: boolean);
    propertyName: number|string;
    log(...args: any[]): void;
}

Here's the section linked above as it appears as of when this answer was written (my emphasis):

Classes

Documentation

You can create a greeter by instantiating the Greeter object, or create a customized greeter by extending from it.

Code

const myGreeter = new Greeter("hello, world");
myGreeter.greeting = "howdy";
myGreeter.showGreeting();

class SpecialGreeter extends Greeter {
  constructor() {
    super("Very special greetings");
  }
}

Declaration

Use declare class to describe a class or class-like object. Classes can have properties and methods as well as a constructor.

declare class Greeter {
  constructor(greeting: string);

  greeting: string;
  showGreeting(): void;
}
发布评论

评论列表(0)

  1. 暂无评论