Skip to content

3.6 regression: unions of callable types involving this types #33379

@rraval

Description

@rraval

TypeScript Version: Version 3.6.3, Version 3.7.0-dev.20190911

Search Terms: intersect function

Code

class A {
    public uniqueToA = "a";

    public getString(this: A): string {
        return "a";
    }
}

class B {
    public uniqueToB = "b";

    public getString(this: B): string {
        return "b";
    }
}

function f(model: A | B): string {
    return model.getString();
}

Expected behavior:

In Typescript 3.5.3, the model.getString() in function f has no error.

Actual behavior:

In Typescript 3.6.3 and 3.7.0-dev.20190911, the code above gets the following errors:

index.ts:18:12 - error TS2684: The 'this' context of type 'A | B' is not assignable to method's 'this' of type 'A & B'.
  Type 'A' is not assignable to type 'A & B'.
    Property 'uniqueToB' is missing in type 'A' but required in type 'B'.

18     return model.getString();
              ~~~~~

  index.ts:10:12
    10     public uniqueToB = "b";
                  ~~~~~~~~~
    'uniqueToB' is declared here.

Playground Link:
http://www.typescriptlang.org/play/#code/MYGwhgzhAECC0G8BQ1XQA4FcBGICWw0mAdngI6YCmAKgPbwC80ARGMwNxIppa4HQBzSgBcAysIBOeYgIAUwgBZ4IALjgBKNREnSBibmjQSRmCcRZtOhgL5JbSUJBgAhfYd75CJclTqumzNgcXO44noIi4lIy8kqq0M6a0NrResiGhsbCpuaBwTZ2XABmJMDCeLTmRbIAtrQAJpQgavAAPglJKbpuRiZm0HWNIAB0QmI6Meqc1kA

Related Issues: #32506

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs ProposalThis issue needs a plan that clarifies the finer details of how it could be implemented.SuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions