打字稿匿名类

use*_*582 15 typescript

在typescript中有没有办法创建匿名类?

我的代码:

export abstract class Runnable {
    public abstract run();
}
Run Code Online (Sandbox Code Playgroud)

而我正在尝试做这样的事情:

new Runnable {
    runner() {
        //implement
    }
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

小智 51

是的,这就是方法。

抽象类:

export abstract class Runnable {
  public abstract run();
}
Run Code Online (Sandbox Code Playgroud)

匿名实现:

const runnable = new class extends Runnable {
  run() {
    // implement here
  }
}();
Run Code Online (Sandbox Code Playgroud)

  • 我投票支持这个答案,因为这是最紧凑的形式,并且真正分配了一个匿名类(无需定义另一个命名类)。 (3认同)

Nit*_*mer 20

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

abstract class Runnable {
    public abstract run();
}

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

runnable.run(); // running...
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)

然而,这种方法的问题在于解释器将在每次使用它时对该类进行评估,这与编译器仅对其进行一次计算的编译语言(例如java)不同.

  • 实际上,只是`new class extends Runnable {/*bla bla bla*/}`似乎有效. (10认同)

hol*_*ava 8

如何创建匿名类?

比方说,你有一个接口Runnable和抽象类Task.当你声明一个类Foo的打字稿你实际创建的类实例Foo及该类的构造函数Foo.你可能想看看在深度打字稿 .Anonymous类REF的构造函数像{new(...args):type}这样可以使用new关键字创建.

interface Runnable {
    run(): void;
}

abstract class Task {
    constructor(readonly name: string) {
    }

    abstract run(): void;
}
Run Code Online (Sandbox Code Playgroud)

创建匿名类通过扩展超类 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");
});
Run Code Online (Sandbox Code Playgroud)

创建匿名类实现接口/类型via class ?.

test('anonymous class implements interface by `class ?`', () => {
    let stub = jest.fn();
    let TestRunner: {new(): Runnable} = class {
        run = stub
    };

    let runner: Runnable = new TestRunner();
    runner.run();

    expect(stub).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)