Ответ 1
Компилятор Closure использует подмножество аннотаций JSDoc (и добавляет несколько своих собственных). См. ссылка аннотации для компилятора для полной версии. Аннотации JSDoc аналогичны аннотации JavaDoc и представляют собой блок комментариев, который начинается с /**
(две звезды). Хотя каждая строка комментария часто начинается с его собственного *
, это соглашение, которое не требуется. В каждой строке разрешен только один тег JSDoc, но аргументы для тега могут охватывать несколько строк.
Аннотации обычно применяются к следующему выражению. Вот несколько примеров:
Переменные
/** @type {string} */ var a;
Тип Cast
var b = /** @type {string} */ (window['foo']);
обратите внимание на дополнительную скобку
Именованная функция
/**
* @param {string} bar
* @return {boolean}
*/
function foo(bar) { return true; }
Выражения функции
/** @type {function(string):boolean} */
var foo = function(bar) { return true; }
var foo2 =
/**
* @param {string} bar
* @return {boolean}
*/
function(bar) { return true; }
Typedef
Сложные типы (включая союзы и типы записей) могут быть сглажены для удобства и удобства использования с помощью typedef. Эти аннотации могут быть длинными, но могут быть разделены на несколько строк для удобства чтения.
/** @typedef {{
* foo:string,
* bar:number,
* foobar:number|string
* }}
*/
var mytype;
В вашем исходном примере существует несколько возможных способов аннотировать такое возвращаемое значение функции. Одним из наиболее специфических и по-прежнему удобным является тип записи:
/** @return {{username:string, password:string, enabled:boolean}} */
function() {
return {
username: 'username',
password: 'password',
enabled: true
}
}
Обратите внимание на дополнительный {}
. Также имейте в виду, что типы записей не будут препятствовать переименованию свойств.
В этой аннотации компилятор сообщает, что функция возвращает анонимный тип с свойствами username
, password
и enabled
. Другими допустимыми параметрами было бы определение интерфейса в другом месте, а тип - возвращаемое значение для этого интерфейса. Наименее специфическая аннотация была бы Object
или *
.
Чтобы увидеть широкий диапазон возможных аннотаций, посмотрите в extern файлы в проекте компилятора.