Как проверить, является ли переменная Enum? - PullRequest
0 голосов
/ 09 мая 2019

Я хочу проверить, является ли переменная действительной Тип сценария Google App Enum .

function myFunc(BORDER_COLOR) {
    if (typeof BORDER_COLOR !== "Enum") {    // This does not work
        // do something for this exception
    }
    // rest of the function
}

Я использую typeof и instanceof для проверки.Но происходит нечто странное.Enum является объектом.Но это не экземпляр объекта.Это противоречит моему пониманию.

  • Я предполагаю, что все примитивные типы (строковые, логические и т. Д.) Не являются объектами.
  • Я предполагаю, что все не примитивны (массив, определяемый пользователем).типы и т. д.) типы являются объектами.
  • ( Почему? )

.

Logger.log(typeof SpreadsheetApp.BorderStyle.SOLID);             // object
Logger.log(SpreadsheetApp.BorderStyle.SOLID instanceof Object);  // false <-- unexpected
Logger.log("");

var value = "text";
Logger.log(typeof value);               // string
Logger.log(value instanceof Object);    // false
Logger.log("");

var value = new String("text");
Logger.log(typeof value);               // object
Logger.log(value instanceof Object);    // true
Logger.log("");

Logger.log(Array instanceof Object);    // true
Logger.log(Object instanceof Object);   // true

Добавлено:

var value = 123;
Logger.log(typeof value);               // number
Logger.log(TYPEOF(value));              // number
Logger.log(value instanceof Object);    // false
Logger.log("");

var value = [];
Logger.log(typeof value);               // object
Logger.log(TYPEOF(value));              // Array[0]
Logger.log(value instanceof Object);    // true
Logger.log("");

var value = {};
Logger.log(typeof value);               // object
Logger.log(TYPEOF(value));              // Object
Logger.log(value instanceof Object);    // true
Logger.log("");

function TYPEOF(value) {
  if (typeof value !== 'object')    // not an object, it is a primitive type
    return typeof value;

  var details = '';
  if (value instanceof Array) {            // if this is an object, may be this is an Array
    details += '[' + value.length + ']';
    if (value[0] instanceof Array)
      details += '[' + value[0].length + ']';
  }

  var className = value.constructor ? value.constructor.name : value.constructor;   // if this is not an Array, get the (tailor-made) constructor name
  return className + details;
}

1 Ответ

0 голосов
/ 09 мая 2019

Используйте Object.keys(), чтобы увидеть, есть ли что-то, что вы можете использовать для проверки. Самые ценные, которые я нашел, это name & ordinal. Так что самой простой проверкой будет узнать, можете ли вы позвонить по номеру name() в Enum.

function test() {
  Logger.log(Object.keys(SpreadsheetApp.BorderStyle.DASHED)); // [name, toString, compareTo, ordinal]
  Logger.log(SpreadsheetApp.BorderStyle.DASHED.name()); // DASHED
  Logger.log("name" in SpreadsheetApp.BorderStyle.DASHED); // true

  try {  
    if ("name" in SpreadsheetApp.BorderStyle.DASHED) { // This is true
      Logger.log("SpreadsheetApp.BorderStyle.DASHED is valid enum"); // This should print
    }
  } catch (err) {}; 

  try {
    if ("name" in SpreadsheetApp.BorderStyle.NOT_VALID) { // This errors
      Logger.log("SpreadsheetApp.BorderStyle.NOT_VALID is not a valid enum"); // Will not print
    }
  } catch (err) {
    Logger.log("Errored");
  };
}

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

/**
 * Check if the type and property are a valid Enum of the SpreadsheetApp.
 * @param {String} type
 * @param {String} property
 * @returns {Boolean}
 */
function isSpreadsheetEnum(type, property) {
  try {
    return SpreadsheetApp[type][property].name() === property;
  } catch (err) {
    return false;
  }
}

Который вы могли бы использовать так:

function testEnum() {
  Logger.log(isSpreadsheetEnum("DataValidationCriteria", "DATE_ON_OR_AFTER"));
}
...