Skip to content

Prototype assignment should take the type of the initializer and not require a literal #39166

Open
@minestarks

Description

@minestarks

This is a feature request based on actual VS customer code.

TypeScript Version: 3.9.2

Search Terms: ES5 class javascript prototype assignment constructor function

Expected behavior: In the example below, the prototype for test.class should include properties from testPrototype.

Actual behavior: Per @sandersn this pattern is recognized in the binder and only uses syntactic information, therefore does not use the type information from testPrototype .

Related Issues: #39167 from same user code. Also #33454 maybe?

Code

var test = {};
test.testPrototype = {
    add: function (i) {
    }
}

test.class = function (name) {

    function getName() {
        return name;
    }

    this.name = getName();
}

test.class.prototype = test.testPrototype; 

var t = new test.class("test");
t.name
t.add // EXPECTED: Binds to `add` from the prototype, ACTUAL: doesn't


//
// Same pattern works when a literal is assigned to the prototype:
//

var test2 = {};

test2.class = function (name) {

    function getName() {
        return name;
    }

    this.name = getName();
}

// replaced `test.testPrototype` with a literal 
test2.class.prototype = {
    add: function (i) {
    }
}; 

var t2 = new test2.class("test");
t2.name
t2.add // ACTUAL: `add` bound correctly
Compiler Options
{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "strictBindCallApply": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "alwaysStrict": true,
    "esModuleInterop": true,
    "checkJs": true,
    "allowJs": true,
    "declaration": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "moduleResolution": 2,
    "target": "ES2017",
    "jsx": "React",
    "module": "ESNext"
  }
}

Playground Link: Provided

Metadata

Metadata

Assignees

No one assigned

    Labels

    Awaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions