Что на самом деле делает typedef от Google closure? - PullRequest
2 голосов
/ 15 августа 2011

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

/** @typedef {{x:number, y:number}} */
example.Point;

... и затем использовать его для документирования функции, что-то вроде ...

/**
 * @param {example.Point} point
 * @return {example.Point}
 */
example.functionThatTakesAPointAndReturnsAPoint(point) {
....
}

Но в чем я не уверен, так это в том, что если он используется только для документации и статической проверки типов компилятора, то зачем typedef нужна эта строка JavaScript? Разве псевдоним не может быть определен целиком в блоке комментариев документации? И, если бы вы обслуживали код напрямую (без его компиляции), что бы интерпретатор JavaScript делал с этой строкой кода после комментария typedef?

Ответы [ 4 ]

2 голосов
/ 16 августа 2011

Компилятор построен поверх Rhino и просто расширяет доступный синтаксис. Я предполагаю, что было проще извлечь псевдоним из свойства no-op, поскольку он соответствует стандартному шаблону.

1 голос
/ 16 августа 2011

На самом деле вы можете установить объявление типа непосредственно в вашем методе doc:

/**
 * @param {{x:number, y:number}} pointLike
 */
var myFn = function(pointLike) {
 return pointLike.x + ':' + pointLike.y;
}

alert(myFn({x:34, y:20}))
alert(myFn({x:34, y:'20'})) // will trigger compile time type warning

Преимущества использования @typedef для типов объектов, которые вы используете в нескольких местах, более удобны в использовании / ясности.

Например: возможно, скоро вы получите атрибут Point.z. Используя typedef, вам нужно всего лишь обновить объявление typedef, а не каждое встроенное объявление типа во всей базе кода.

См. Также Использование тега @typedef Google Closure

0 голосов
/ 24 декабря 2018

Было бы лучше, если бы весь typedef был определен в комментарии.Определение его части как кода имеет некоторые непредвиденные последствия.Смотрите это сообщение в блоге .

Причина, по которой имя typedef определяется в реальном коде, заключается в том, как в Closure Compiler работает синтаксический анализ и проверка типов.Синтаксическому анализатору необходимо прикрепить каждый комментарий jsdoc к узлу AST, в противном случае комментарий игнорируется.Таким образом, имя typedef определяется как код, к нему присоединяется jsdoc, а затем средство проверки типов выбирает определение типа.

0 голосов
/ 15 августа 2011

Это не только для документации. Это также предупреждает вас при компиляции скрипта с использованием компилятора закрытия.

Компилятор Closure может использовать информацию о типе данных JavaScript переменные для обеспечения улучшенной оптимизации и предупреждений. JavaScript, однако не имеет возможности объявлять типы.

...