Typescript – Interfaces with construct signatures not type checking

typescript

I've been playing a bit with interfaces with construct signatures in TypeScript, and I became a bit confused when the following failed to type check:

class Foo {
    constructor () {
    }
}

interface Bar {
    new(): Bar;
}

function Baz(C : Bar) {
    return new C()
}

var o = Baz(Foo);

The type error is:

Supplied parameters do not match any signature of call target:
Construct signatures of types 'new() => Foo' and 'Bar' are
incompatible: Type 'Bar' requires a construct signature, but Type
'Foo' lacks one (C: Bar) => Bar

The type of Foo's constructor is () => Foo, and that is what I thought that Bar said. Am I missing something here?

Best Answer

Here is an updated version of your code with a subtle change.

We define the Bar interface with whatever functions and variables we expect to be present.

Next, we extend the Bar interface with the NewableBar interface. This just defined a constructor that returns a Bar.

Because Foo implements Bar and has a constructor and Baz requires a NewableBar, everything is checked.

This is a little more verbose than any - but gives you the checking you want.

interface Bar {

}

interface NewableBar extends Bar {
    new();
}

class Foo implements Bar {
    constructor () {

    }
}

function Baz(C : NewableBar) {
    return new C()
}

var o = Baz(Foo);
Related Topic