An if statement that is obviously always false, eg. if (false)
, closure removes the statement.
My code looks like this:
if (settings.lang === "en"){
lib.doSomething();
}
settings.lang
is a constant.
/**
* @type {string}
* @const
*/
settings.lang = "fr" ;
So when it equals "fr" the compiler could remove the if
and the definition of lib.doSomething
at compile time. But it doesn't. Is there any way to get it to do that?
Before you ask why I don't just delete that code: for other clients, settings.lang
is set to en
.
1) Make sure "settings" is properly defined:
/** @const */
var settings = {};
2) Make sure "settings" lang is properly defined:
/** @const */
settings.lang = "fr" ;
3) Make sure the value is referenced after it is defined:
if (settings.lang == "en") ...
In advanced mode this will be inlined and removed, if settings is not used in a way that prevents property collapsing (for instance, passing "settings" as a parameter to a function will cause the value to escape and be uncollapsible).
This is simplified, if you use @define:
/** @const */
var settings = {};
/** @define {string} */
settings.lang = "fr";
You should get a warning if the definition of the define is not valid in some way.