如何防止警告'属性MyProp1从未在MyObject上定义'?

时间:2012-03-05 03:05:35

标签: javascript google-closure-compiler google-closure

我有一些包含JSON字符串的HTML。在 on DOM ready 回调中,我有类似这样的内容:

MyObject = JSON.parse($('#TheJsonString').html());

稍后在我的代码中,我写了一些内容:

var SomeVar = MyObject.MyProp1;

然后当我通过Google闭包编译器运行代码时,我收到警告

  

属性MyProp1从未在MyObject上定义。

如何编写代码以便它不会生成警告?

5 个答案:

答案 0 :(得分:15)

删除警告的最简洁方法是定义JSON的结构。这可以使用@type标记来完成:

/** @type {{MyProp1:string}} */

其中MyProp1是属性的名称,string是类型。

Google的Closure编译器将重命名该变量。如果你不想这样,你必须使用引号+括号而不是点符号:

MyObject['MyProp1']

示例:将以下内容粘贴到Closure Compiler

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

var MyObject;
function x() { // Magic happens at the next line
    /** @type {{MyProp1:string}}*/
    MyObject = JSON.parse(prompt(''));
}
function afterX() {
    var SomeVar = MyObject.MyProp1;
    alert(SomeVar);
}
x();
afterX();

输出:

var a;a=JSON.parse(prompt(""));alert(a.a);

答案 1 :(得分:7)

要取消特定功能的此警告,您可以使用@suppress注释:

/**
 * @suppress {missingProperties}
 */
function useJsonObject() { ... }

要全局关闭此警告 ,请使用jscomp_off编译器标记关闭missingProperties class of warnings

答案 2 :(得分:3)

尝试以这种方式访问​​该媒体资源:

var SomeVar = MyObject['MyProp1'];

答案 3 :(得分:1)

不应将JSON内容作为HTML放在#TheJsonString对象中,而应将其作为实际的javascript放在页面中。如果服务器正在生成页面中的内容,那么服务器就没有理由需要生成您随后解析的HTML。服务器只需在脚本标记内创建一个javascript变量,并将实际的javascript数据结构放入其中。

JSON.parse()对于解析ajax响应非常有用,但是当服务器可以将完成的javascript放在生成的页面中时,它实际上是不需要的。

答案 4 :(得分:0)

<!DOCTYPE html>
<html>
<head></head>
<body>
<div id="TheJsonString">
    {"bindings": "hr", "method":"asd"}
</div>
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<script type="text/javascript">
    var MyObject = JSON.parse($('#TheJsonString').html());

    var SomeVar = MyObject.bindings;

    console.log(SomeVar);
</script>
</body>
</html>

我测试了这样,但没有任何警告它工作正常。