node package manager

interface

Enforce an interface on classes

Interface-js

Build Status Coverage Status

Exposes a way to enforce an interface on classes.

Installation

npm install --save interface

Usage

To enforce an interface, first create a new Interface and pass it the function names that you want to enforce.

const MyInterface = Interface.create('myMethodA', 'myMethodB')

or alternatively

const MyInterface = new Interface('myMethodA', 'myMethodB')

Next, just make your class extend from the interface. Make sure you call super() within your class's constructor.

class MyClass extends MyInterface {
  constructor () {
    super()
  }
 
  myMethodA () {
    // ...implementation goes here 
  }
}

Now, whenever you try to instantiate MyClass, the interface will be enforced.

let instance = new MyClass()
// throws a new error with the message: 
// 'The following function(s) need to be implemented for class MyClass: myMethodB' 

Of course, the interface is enforced on all subclasses as well.

class MySubClass extends MyClass {
  constructor () {
    super()
  }
 
  myMethodA () {
    // override 'myMethodA' 
  }
}
 
let instance = new MySubClass()
// still throws an error with the message: 
// 'The following function(s) need to be implemented for class MyClass: myMethodB' 

Interfaces can be enforced for classes defined the old way too.

const inherits = require('util').inherits
 
var MyInterface = new Interface('myMethodA', 'myMethodB', 'myMethodC')
 
function MyClass () {
  MyInterface.call(this)
}
 
inherits(MyClass, MyInterface)
 
MyClass.prototype.myMethodA = function () {
  // implementation 
}
 
function MySubClass () {
  MyClass.call(this)
}
 
// inherit prototype of parent class 
inherits(MySubClass, MyClass)
 
MySubClass.prototype.myMethodB = function () {
  // implementation 
}
 
var instance = new MySubClass()
// throws an error with the message: 
// 'The following function(s) need to be implemented for class MyClass: myMethodC'