Подтвердить что ты не робот

Как я могу предотвратить предупреждение "Свойство MyProp1 никогда не определено в MyObject"?

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

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

Позже в моем коде я пишу что-то следующее:

var SomeVar = MyObject.MyProp1;

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

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

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

4b9b3361

Ответ 1

Самый чистый способ удалить предупреждение - это определить структуру 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);

Ответ 2

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

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

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

Ответ 3

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

var SomeVar = MyObject['MyProp1'];

Ответ 4

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

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

Ответ 5

<!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>

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