Disallow the type conversion with shorter notations. (no-implicit-coercion)
The --fix option on the command line can automatically fix some of the problems reported by this rule.
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 = 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 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"(trueby default) - When this istrue, this rule warns shorter type conversions forbooleantype. -
"number"(trueby default) - When this istrue, this rule warns shorter type conversions fornumbertype. -
"string"(trueby default) - When this istrue, this rule warns shorter type conversions forstringtype. -
"disallowTemplateShorthand"(falseby default) - When this istrue, this rule warnsstringtype conversions using${expression}form. -
"allow"(emptyby 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 = !!foo;
var b = ~foo.indexOf(".");
// 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 = +foo; var n = 1 * foo;
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);
string
Examples of incorrect code for the default { "string": true } option:
/*eslint no-implicit-coercion: "error"*/ var s = "" + foo; var s = `` + foo; foo += ""; foo += ``;
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 = `${foo}`;
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 1.0.0-rc-2.
Resources
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/rules/no-implicit-coercion