Skip to content

Allow default methods/instance variables in interfaces #3536

Closed

Description

This would be epic to have. Java itself had a problem with forcing the implementing class to implement the abstract methods, and solved it with default interface implementations. Sometimes, multiple inheritance is necessary to have. For example, I have a sea of crisscrossing is-a relationships to handle, with a ton of things like the following:

class Identifier extends Node implements Assignable, ImportPatternEntry,
        IdentifierLike, PropertyLike, Subtypable {
    // stuff...
}

class MemberExpression extends Node implements Assignable,
        IdentifierLike, PropertyLike, Subtypable {
    // stuff...
}

It's not pretty, but I also have to check many of these relationships at runtime as well. I can't use traditional single inheritance for this, either, because none of these are mutually exclusive. I would love to have ways to set default properties on these classes, to where I don't have to make a build script to generate all this. (I have 30+ base classes and 20+ interfaces with very intertwined relationships like the above.)

What I was thinking of was something like this:

interface IFoo {
  bar = true;
}

class Foo {}

class Bar implements IFoo {}

new Foo().bar; // undefined
new Bar().bar; // true

Activity

  1. danquirk commented on Jun 17, 2015

    @danquirk
    Member

    Definitely feels like part of a mixin story.

  2. dead-claudia commented on Jun 29, 2015

    @dead-claudia
    Author

    I'm going to close this for now, since I'm looking at the fact it's not as nice as the original proposal on the other thread.

  3. izogfif commented on May 31, 2018

    @izogfif

    Now that mixins were added in the language, could someone provide an example of the interface with default method via mixin? How to write

    interface Foo {
      getValue: number;
    }
    interface Bar extends Foo {
      getValue(): number { // Default implementation, may be overridden in children
        return 42;
      }
    }
    
    
  4. locked and limited conversation to collaborators on Jul 31, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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