2

我了解它的用途 - 我可以看到能够为复杂类型定义别名并在文档中使用它的好处。所以你可以定义一个类型,比如......

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

...然后用它来记录一个函数,比如...

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

但我不确定的是,如果它只用于文档和编译器的静态类型检查,那么为什么 typedef 需要那行 JavaScript?别名不能完全在文档注释块中定义吗?而且,如果您直接提供代码(不编译它),JavaScript 解释器会如何处理 typedef 注释之后的那行代码?

4

4 回答 4

2

编译器建立在 Rhino 之上,只是增强了可用的语法。我认为从无操作属性访问中获取别名更容易,因为它与标准模式匹配。

于 2011-08-16T13:07:04.890 回答
1

您实际上可以直接在方法文档中设置类型声明:

/**
 * @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 声明,而不是整个代码库中的每个内联类型声明。

另请参阅使用 Google Closure 的 @typedef 标签

于 2011-08-16T11:47:47.657 回答
0

它不仅用于文档。当你使用闭包编译器编译你的脚本时,它也会给你警告。

Closure Compiler 可以使用有关 JavaScript 变量的数据类型信息来提供增强的优化和警告。然而,JavaScript 无法声明类型。

于 2011-08-15T09:06:04.313 回答
0

如果整个 typedef 在注释中定义会更好。将其中的一部分定义为代码会产生一些意想不到的后果。请参阅此博客文章

在实际代码中定义 typedef 名称的原因是 Closure Compiler 中解析和类型检查的工作方式。解析器需要将每个 jsdoc 注释附加到一个 AST 节点,否则注释会被静默忽略。因此,typedef 的名称被定义为代码,jsdoc 附加到它,然后类型检查器选择类型定义。

于 2018-12-24T07:45:36.703 回答