Есть ли способ создать интерфейсы в ES6 / Node 4?


ES6 полностью доступен в узле 4. Мне было интересно, включает ли он концепцию интерфейса для определения контрактов метода, как в MyClass implements MyInterface.

Я не могу найти много с моим Googling, но, возможно, есть хороший трюк или обходной путь.

2 84

2 ответа:

интерфейсы не являются частью ES6, но классы есть.

Если вы действительно нуждаетесь в них, вы должны посмотреть TypeScript, который поддерживать их.

в комментариях debiasej написал упомянутую ниже статью, объясняющую больше о шаблонах проектирования (на основе интерфейсов, классов):

http://loredanacirstea.github.io/es6-design-patterns/

Design patterns книга в javascript также может быть полезна для вас:

http://addyosmani.com/resources/essentialjsdesignpatterns/book/

шаблон = классы + интерфейс или множественное наследование

An пример Заводского шаблона в ES6 JS (для запуска: пример узла.js):

"use strict";

// Types.js - Constructors used behind the scenes

// A constructor for defining new cars
class Car {
  constructor(options){
    console.log("Creating Car...\n");
    // some defaults
    this.doors = options.doors || 4;
    this.state = options.state || "brand new";
    this.color = options.color || "silver";
  }
}

// A constructor for defining new trucks
class Truck {
  constructor(options){
    console.log("Creating Truck...\n");
    this.state = options.state || "used";
    this.wheelSize = options.wheelSize || "large";
    this.color = options.color || "blue";
  }
}


// FactoryExample.js

// Define a skeleton vehicle factory
class VehicleFactory {}

// Define the prototypes and utilities for this factory

// Our default vehicleClass is Car
VehicleFactory.prototype.vehicleClass = Car;

// Our Factory method for creating new Vehicle instances
VehicleFactory.prototype.createVehicle = function ( options ) {

  switch(options.vehicleType){
    case "car":
      this.vehicleClass = Car;
      break;
    case "truck":
      this.vehicleClass = Truck;
      break;
    //defaults to VehicleFactory.prototype.vehicleClass (Car)
  }

  return new this.vehicleClass( options );

};

// Create an instance of our factory that makes cars
var carFactory = new VehicleFactory();
var car = carFactory.createVehicle( {
            vehicleType: "car",
            color: "yellow",
            doors: 6 } );

// Test to confirm our car was created using the vehicleClass/prototype Car

// Outputs: true
console.log( car instanceof Car );

// Outputs: Car object of color "yellow", doors: 6 in a "brand new" state
console.log( car );

var movingTruck = carFactory.createVehicle( {
                      vehicleType: "truck",
                      state: "like new",
                      color: "red",
                      wheelSize: "small" } );

// Test to confirm our truck was created with the vehicleClass/prototype Truck

// Outputs: true
console.log( movingTruck instanceof Truck );

// Outputs: Truck object of color "red", a "like new" state
// and a "small" wheelSize
console.log( movingTruck );