我创建了一个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()
,我想直接调用该类的函数。
如何实现导入一个类并调用它的方法而又不实例化另一个类?
答案 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();
}
}