打字稿匿名类

时间:2017-03-13 15:09:14

标签: typescript

在打字稿中是否有办法创建匿名类?

我的代码:

export abstract class Runnable {
    public abstract run();
}

我正试图做这样的事情:

new Runnable {
    runner() {
        //implement
    }
}

我该怎么做?

3 个答案:

答案 0 :(得分:17)

不完全,但你可以这样做:

abstract class Runnable {
    public abstract run();
}

let runnable = new (class MyRunnable extends Runnable {
    run() {
        console.log("running...");
    }
})();

runnable.run(); // running...

code in playground

然而,这种方法的问题在于,解释器每次使用它时都会对类进行评估,这与编译器只对其进行一次计算的编译语言(例如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();
}