Как я могу предотвратить предупреждение «Свойство MyProp1 никогда не определяется в MyObject»? - PullRequest
13 голосов
/ 05 марта 2012

У меня есть некоторый HTML, который содержит строку JSON.В обратном вызове на DOM ready у меня есть что-то вроде этого:

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

Позже в моем коде я пишу что-то такое:

var SomeVar = MyObject.MyProp1;

А потом, когдаЯ запускаю код через компилятор закрытия Google, я получаю предупреждение

Свойство MyProp1 никогда не определяется в MyObject.

Как должен быть написан код, чтобы он негенерировать предупреждение?

Ответы [ 5 ]

15 голосов
/ 05 марта 2012

Самый чистый способ удалить предупреждение - определить структуру JSON. Это можно сделать с помощью тега @type:

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

Где MyProp1 - это имя свойства, а string - это тип.

Компилятор Google Closure переименует переменную. Если вы не хотите этого, вы должны использовать кавычки + скобки вместо точечной нотации:

MyObject['MyProp1']

Пример : вставить следующее в Закрывающий компилятор :

// ==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);
7 голосов
/ 03 ноября 2013

Чтобы отключить это предупреждение для определенной функции, вы можете использовать аннотацию @suppress:

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

Чтобы отключить это предупреждение глобально , используйте флаг компилятора jscomp_offотключить класс предупреждений missingProperties .

3 голосов
/ 05 марта 2012

Попробуйте получить доступ к недвижимости следующим образом:

var SomeVar = MyObject['MyProp1'];
1 голос
/ 05 марта 2012

Вместо того, чтобы помещать содержимое JSON в объект #TheJsonString в виде HTML, вы должны поместить его на своей странице как фактический javascript.Если сервер генерирует контент на странице, то нет причин, по которым серверу нужно генерировать HTML, который вы затем анализируете.Сервер может просто создать переменную javascript внутри тега script и поместить в нее фактическую структуру данных javascript.

JSON.parse() очень полезен для анализа ответов ajax, но в действительности это не нужно, когда сервер можетпросто поместите готовый JavaScript прямо на сгенерированную страницу.

0 голосов
/ 05 марта 2012
<!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>

Я проверил это так, но он работает без каких-либо предупреждений.

...