no-implicit-coercion
Disallow shorthand type conversions
Some problems reported by this rule are automatically fixable by the --fix
command line option
Some problems reported by this rule are manually fixable by editor suggestions
This rule is currently frozen and is not accepting changes.
In JavaScript, there are a lot of different ways to convert value types. Some of them might be hard to read and understand.
Such as:
var b = !!foo;
var b = ~foo.indexOf(".");
var n = +foo;
var n = -(-foo);
var n = foo - 0;
var n = 1 * foo;
var s = "" + foo;
foo += ``;
Those can be replaced with the following code:
var b = Boolean(foo);
var b = foo.indexOf(".") !== -1;
var n = Number(foo);
var n = Number(foo);
var n = Number(foo);
var n = Number(foo);
var s = String(foo);
foo = String(foo);
Rule Details
This rule is aimed to flag shorter notations for the type conversion, then suggest a more self-explanatory notation.
Options
This rule has three main options and one override option to allow some coercions as required.
"boolean"
(true
by default) - When this istrue
, this rule warns shorter type conversions forboolean
type."number"
(true
by default) - When this istrue
, this rule warns shorter type conversions fornumber
type."string"
(true
by default) - When this istrue
, this rule warns shorter type conversions forstring
type."disallowTemplateShorthand"
(false
by default) - When this istrue
, this rule warnsstring
type conversions using${expression}
form."allow"
(empty
by default) - Each entry in this array can be one of~
,!!
,+
,- -
,-
, or*
that are to be allowed.
Note that operator +
in allow
list would allow +foo
(number coercion) as well as "" + foo
(string coercion).
boolean
Examples of incorrect code for the default { "boolean": true }
option:
/*eslint no-implicit-coercion: "error"*/
var b = ;
var b = ;
// bitwise not is incorrect only with `indexOf`/`lastIndexOf` method calling.
Examples of correct code for the default { "boolean": true }
option:
/*eslint no-implicit-coercion: "error"*/
var b = Boolean(foo);
var b = foo.indexOf(".") !== -1;
var n = ~foo; // This is a just bitwise not.
number
Examples of incorrect code for the default { "number": true }
option:
/*eslint no-implicit-coercion: "error"*/
var n = ;
var n = ;
var n = ;
var n = ;
Examples of correct code for the default { "number": true }
option:
/*eslint no-implicit-coercion: "error"*/
var n = Number(foo);
var n = parseFloat(foo);
var n = parseInt(foo, 10);
var n = foo * 1/4; // `* 1` is allowed when followed by the `/` operator
string
Examples of incorrect code for the default { "string": true }
option:
/*eslint no-implicit-coercion: "error"*/
var s = ;
var s = ;
;
;
Examples of correct code for the default { "string": true }
option:
/*eslint no-implicit-coercion: "error"*/
var s = String(foo);
foo = String(foo);
disallowTemplateShorthand
This option is not affected by the string
option.
Examples of incorrect code for the { "disallowTemplateShorthand": true }
option:
/*eslint no-implicit-coercion: ["error", { "disallowTemplateShorthand": true }]*/
var s = ;
Examples of correct code for the { "disallowTemplateShorthand": true }
option:
/*eslint no-implicit-coercion: ["error", { "disallowTemplateShorthand": true }]*/
var s = String(foo);
var s = `a${foo}`;
var s = `${foo}b`;
var s = `${foo}${bar}`;
var s = tag`${foo}`;
Examples of correct code for the default { "disallowTemplateShorthand": false }
option:
/*eslint no-implicit-coercion: ["error", { "disallowTemplateShorthand": false }]*/
var s = `${foo}`;
allow
Using allow
list, we can override and allow specific operators.
Examples of correct code for the sample { "allow": ["!!", "~"] }
option:
/*eslint no-implicit-coercion: [2, { "allow": ["!!", "~"] } ]*/
var b = !!foo;
var b = ~foo.indexOf(".");
When Not To Use It
If you don’t want to be notified about shorter notations for the type conversion, you can safely disable this rule.
Version
This rule was introduced in ESLint v1.0.0-rc-2.