我有一个包含我的knockout viewModel的javascript文件。我添加了对knockout调试文件的引用,但intellisense仅在我位于名称空间花括号之外时才有效:
/// <reference path="knockout-2.0.0.debug.js" />
// YES! I get intellisense here :-)
(function (window, $, ko, undefined) {
// ... lots of js
// NO intellisense in here :-(
})(window, jQuery, ko);
我的命名空间签名中的ko
似乎是“隐藏”真正的ko名称空间。 除了将我的命名空间签名更改为:之外,还有其他解决方法吗?
(function (window, $, myKo, undefined) {
(也许我错过了名称空间的东西?我甚至需要将ko
传递到我的名称空间吗?)
答案 0 :(得分:2)
Intellisense不够聪明,无法遵循参考。可以说你无论如何都不需要像这样注入你的'命名空间'。我认为它甚至不是命名空间,它只是一个闭包。考虑到正常用例,命名空间是一堆相关代码的全局容器。应用程序可能在全局范围内具有单个引用,这将被视为应用程序的命名空间。其他库(如jQuery)将在全局范围内注册自己的值,这可能被视为命名空间。在其他情况下,您可以将整个范围包装在闭包中,在闭包中注册命名空间,因此您永远不需要触及全局范围。
我可以看到为什么你可能想要为你的函数注入一个引用。这种方式遵循接口模式,因此您可以使用模拟版本将这些变量交换出来。不幸的是,我不认为你可以推断出对Intellisense的引用,并且出于同样的原因(即你可以将它与任何东西交换出来)它无法确切地告诉这些对象包含什么。
在静态类型的世界中,我们实际上定义了接口对象,它允许Intellisense反映注入的引用,断言它们至少具有在接口上定义的方法。
我认为你真正必须保留Intellisense的唯一选择是引用这些库定义的全局引用。
<强>更新强>
看起来Microsoft实际上使用了类型注释来允许您显式引用函数的参数类型。我测试了这个用jQuery暗示引用的版本
/// <reference path="jquery-1.6.2-vsdoc.js" />
(function ($) {
/// <param name="$" type="jQuery">
/// A rererence to jQuery
/// </param>
})(jQuery);
jQuery intellisense版本声明了jQuery的返回类型。假设Knockout具有intellisense,它定义了您可以以相同方式注释函数的类型。一般来说,我认为你可以声明一个这样的对象类型:
var someObject = (function() {
/// <returns type="someObject" />
// implementation here, returning object
})();
function (a) {
/// <summary>
/// This function requires a to be a reference to a someObject type
/// </summary>
/// <param name="param" type="someObject">
/// A reference to a someObject type
/// </param>
/// <returns type="String" />
// we now have intellisense on a, treating it as someObject
}
因此,如果您准备完成添加注释的过程,您可以让Intellisense工作。