Внедрение функций в (пользовательский) контейнер enum - PullRequest
1 голос
/ 10 октября 2019

Можно ли преобразовать следующий код для контейнера объекта "Enum":

/* enum.js */
let Enum = {};

Enum.Color = {
  check: (value) => {
    [
      'red',
      'green',
      'blue',
    ].indexOf(value) !== -1;
  },
};

Enum.Size = {
  check: (value) => {
    [
      'big',
      'medium',
      'small',
    ].indexOf(value) !== -1;
  },
};

export default Enum;

таким образом, чтобы минимализм и внедрение функций?

let Enum = {};

Enum.Color = { values: [
      'red',
      'green',
      'blue',
    ],
  },
};

Enum.Size = { values: [
      'big',
      'medium',
      'small',
    ],
  },
};

// here some code that inject the check function and 
// other fcts to follows in every Enum property (lets say, with a values property inside) 

export default Enum;

Thisмодель очень гибкая, потому что я мог бы добавить другие метаданные к различным перечислениям.

Время от времени enum используется следующим образом

import Enum from 'enum';
Enum.Size.check('medium');

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Я бы рекомендовал использовать следующий формат:

Enum.Color = {
  red: "#F00",
  green: "#0F0",
  blue: "#00F"
};

Enum.Size = {
  big: "200px",
  medium: "400px",
  small: "600px"
};

Таким образом, вы также можете добавить дополнительную информацию к каждому перечислению (например, порядок, важность, классы или значения CSS), также сможете проверитьесли перечисление существует с использованием оператора in.

var Enum = {};

Enum.Color = {
  red: "#F00",
  green: "#0F0",
  blue: "#00F"
};

console.log("red" in Enum.Color);
console.log("black" in Enum.Color);
console.log(Enum.Color.red);

Если вы непреклонны, если бы он выглядел так, как вы описали, то:

let Enum = {};

Enum.Color = {
  check: [
    'red',
    'green',
    'blue',
  ]
};

Enum.Size = {
  check: [
    'big',
    'medium',
    'small',
  ]
};

Object.keys(Enum).forEach(function(key) {
  var list = Enum[key].check;
  Enum[key].check = value => list.indexOf(value) !== -1;
});

console.log(Enum.Color.check("red"));
console.log(Enum.Color.check("black"));
console.log(Enum.Size.check("tiny"));
console.log(Enum.Size.check("medium"));
1 голос
/ 10 октября 2019

Один из способов (я не знаю, достаточно ли он минималистичен, но, безусловно, без повторений ) - создать интерфейс / класс, представляющий проверяемый объект, например:

class Checkable {
  constructor (values) {
    this.values = values;
  }

  check (value) {
    return this.values.indexOf(value) !== -1;
  }
}
const Enum = {
  Color: new Checkable(['red', 'green', 'blue']),
  Size: new Checkable(['small', 'medium', 'big'])
}

console.log(Enum.Color.check('green'))
console.log(Enum.Size.check('xxl'))

Таким образом, добавление других распространенных методов очень просто. Наиболее важным преимуществом здесь является то, что это решение не вводит никаких повторений в ваш код, который я считаю абсолютным выигрышем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...