在打字稿中是否有办法创建匿名类?
我的代码:
export abstract class Runnable {
public abstract run();
}
我正试图做这样的事情:
new Runnable {
runner() {
//implement
}
}
我该怎么做?
答案 0 :(得分:17)
不完全,但你可以这样做:
abstract class Runnable {
public abstract run();
}
let runnable = new (class MyRunnable extends Runnable {
run() {
console.log("running...");
}
})();
runnable.run(); // running...
然而,这种方法的问题在于,解释器每次使用它时都会对类进行评估,这与编译器只对其进行一次计算的编译语言(例如java)不同。
答案 1 :(得分:8)
假设您有一个接口Runnable
和一个抽象类Task
。当您在typescript中声明一个类Foo
时,您实际创建了一个{{1}的类实例}&类Foo
的构造函数。您可能希望在typescript中看到深度。作为Foo
之类的构造函数引用的匿名类可以使用{new(...args):type}
关键字创建
new
interface Runnable {
run(): void;
}
abstract class Task {
constructor(readonly name: string) {
}
abstract run(): void;
}
class extends ?
test('anonymous class extends superclass by `class extends ?`', () => {
let stub = jest.fn();
let AntTask: {new(name: string): Task} = class extends Task {
//anonymous class auto inherit its superclass constructor if you don't declare a constructor here.
run() {
stub();
}
};
let antTask: Task = new AntTask("ant");
antTask.run();
expect(stub).toHaveBeenCalled();
expect(antTask instanceof Task).toBe(true);
expect(antTask.name).toBe("ant");
});
创建匿名类实现接口/类型。class ?
答案 2 :(得分:2)
是的,这就是方法。
抽象类:
SecretKey
匿名实现:
export abstract class Runnable {
public abstract run();
}