Как я могу предотвратить предупреждение "Свойство MyProp1 никогда не определено в MyObject"?
У меня есть HTML, который содержит строку JSON. В ответном обратном вызове DOM у меня есть что-то вроде этого:
MyObject = JSON.parse($('#TheJsonString').html());
Позже в моем коде я пишу что-то следующее:
var SomeVar = MyObject.MyProp1;
И затем, когда я запускаю код через компилятор Google закрытия, я получаю предупреждение
Свойство MyProp1 никогда не определено в MyObject.
Как код должен быть написан так, чтобы он не генерировал предупреждение?
Ответы
Ответ 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>
Я тестировал его так, но он отлично работает без каких-либо предупреждений.