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

时间:2019-01-13 00:05:43

标签: typescript import export

我创建了一个Tools类,以从中扩展每个类,因为它包含所有类都使用的一组功能。

我像这样导出我的班级:

Tools.ts

export abstract class Tools {
  getRandom(bytes) {
    return 21 // Example
  }
}

Main.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)
  }
}

我得到的错误:

Type 'typeof import("[...]/tools")' is not a constructor function type

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

如何实现导入一个类并调用它的方法而又不实例化另一个类?

2 个答案:

答案 0 :(得分:1)

您使用的是命名为export ,因此您的import语句应如下所示:

import { Tools } from './Tools.ts'

如果您不喜欢显式调用super,则可以跳过constructor。在这种情况下,JavaScript运行时将为您调用它。

class Main extends Tools {
  token() {
    this.getRandom(2)
  }
}

答案 1 :(得分:1)

尽管您的问题先前已得到解决,但由于我想获得与扩展类在语义上有所不同的功能,因此我想介绍一下。将实用程序函数存储在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();
    }
}

但是,通常不鼓励在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();
    }
}