Skip to content

Allow assignment of void returning functions to appropriate construct signature types #2310

Closed
@danquirk

Description

@danquirk

Consider an existing JS constructor function

var Foo = function (x,y) { 
    this.x = x;
    this.y = y;
}
var foo = new Foo(1,2);

This is allowed in TypeScript due to a specific exception which allows new to be called on non-constructor functions only if they're void returning. Now if you want to more strongly type this code, but without converting to full on classes yet, we do not allow you to do so in a fully typesafe manner:

interface FooInstance {
    x: number;
    y: number;
}
interface FooConstructor {
    new (x: number, y: number): FooInstance;
}
// this an error, new(x,y)=>FooInstance is not assignable to (x,y)=>void
var Foo: FooConstructor = function (x,y) {
    this.x = x;
    this.y = y;
}
var foo = new Foo(1,2);

We require you to cast the constructor function to any or Function in order for it to be assignable to the FooConstructor interface.

Given that we've made an exception for void returning functions already in order to accommodate this pattern it doesn't seem crazy to make one more exception for them through the assignability relation in order to complete the desired scenario.

See #2299 for another example from a customer.

Metadata

Metadata

Assignees

No one assigned

    Labels

    DeclinedThe issue was declined as something which matches the TypeScript visionSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions