Помеченные союзы в закрывающем компиляторе

В настоящее время я сравниваю компилятор Google Closure и статическую проверку типов Flow с точки зрения выразительности. Что мне нравится в последнем, так это то, что он, по-видимому, может довольно хорошо представлять помеченные союзы. Руководство дает этот пример:

type Result = Done | Error; // a disjoint union type with two cases
type Done = { status: 'done', answer: Matrix };
type Error = { status: 'error', message: string };

Есть ли способ сделать что-то подобное с помощью Closure Compiler? Что означает какой-то способ заставить определенные свойства объекта не только иметь определенный тип, но и иметь фиксированное значение? И использовать это значение для вывода типа, чтобы различать различные варианты в объединении? Я не нашел документации на этот счет.

1 ответ

Точного перевода нет. Вот как бы я написал это:

/** @enum {string} */
var ResultStatus = {
  DONE: 'done',
  ERROR: 'error'
};

/** @record */
var Done = function() {};

/** @type {ResultStatus} */
Done.prototype.status;

/** @type {Matrix} */
Done.prototype.answer;

/** @record */
var Error = function() {};

/** @type {ResultStatus} */
Error.prototype.status;

/** @type {string} */
Error.prototype.message;

/** @type {Result|Error} */
var Result;

Это очень подробный синтаксис, но обеспечивает лучшую проверку типов. Предполагается, что любой объект с этими свойствами соответствует типу. Дополнительные свойства разрешены.

Есть намного более короткий синтаксис с немного другим поведением: typedefs.

/** @enum {string} */
var ResultStatus = {
  DONE: 'done',
  ERROR: 'error'
};

/**
 * @typedef{{
 *   status: ResultStatus
 *   answer: Matrix
 * }}
 */
var Done;

/**
 * @typedef{{
 *   status: ResultStatus
 *   message: string
 * }}
 */
var Error;

/** @type {Result|Error} */
var Result;

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

Другие вопросы по тегам