如何在不实例化类的情况下调用该类的方法?

Hyp*_*olf 1 import export typescript

我创建了一个 Tools 类来扩展它的每个类,因为它包含所有类使用的一组函数。

我像这样导出我的课程:

工具.ts

export abstract class Tools {
  getRandom(bytes) {
    return 21 // Example
  }
}
Run Code Online (Sandbox Code Playgroud)

主.ts

import * as Tools from './Tools.ts'

class Main extends Tools { // <-- I get the error from the Tools keyword here
  constructor() {
    super() // If not, I get an error
  }

  token() { // Example method
    this.getRandom(2)
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Type 'typeof import("[...]/tools")' is not a constructor function type
Run Code Online (Sandbox Code Playgroud)

我不想new Tools()在每个类中都使用,我想直接调用类的函数。

如何实现导入类并调用它的方法而不在其他类中实例化该类?

Chr*_*vic 9

尽管您的问题之前已经解决,但我想插话,因为我认为您想要实现与扩展类在语义上不同的东西。将实用函数存储在Tools类中并扩展它会阻止您进一步继承。此外,您可能只想使用一个实用函数,但仍然继承所有函数,这对于 lodash 来说将是可怕的。

您最有可能寻找的是所谓的静态方法。无需类的特定实例即可直接调用的类方法。

// In Tools.ts
export class Tools {
    // https://xkcd.com/221/
    public static getRandomNumber() {
        return 4; // chosen by fair dice roll.
                  // guaranteed to be random. 
    }
}

// Somewhere else
import { Tools } from "./Tools";

export class Main {
    public doSomething() {
        const randomNumber = Tools.getRandomNumber();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在 TypeScript 中,通常不鼓励导出仅包含静态方法的类,并且这些方法应该封装在它们自己的函数中,您可以显式导入这些函数以减少包大小:

// In Tools.ts
export function getRandomNumber() {
    // https://xkcd.com/221/
    return 4; // chosen by fair dice roll.
              // guaranteed to be random. 
}

// Somewhere else
import { getRandomNumber } from "./Tools";

export class Main {
    public doSomething() {
        const randomNumber = getRandomNumber();
    }
}
Run Code Online (Sandbox Code Playgroud)