no-base-to-string
Requires .toString()
to only be called on objects which provide useful information when stringified.
JavaScript will call toString()
on an object when it is converted to a string, such as when +
adding to a string or in ${}
template literals.
The default Object .toString()
returns "[object Object]"
, so this rule requires stringified objects define a more useful .toString()
method.
Note that Function
provides its own .toString()
that returns the function's code.
Functions are not flagged by this rule.
This rule has some overlap with restrict-plus-operands
and restrict-template-expressions
.
Attributes
- Included in configs
- ✅ Recommended
- 🔒 Strict
- Fixable
- 🔧 Automated Fixer
- 🛠 Suggestion Fixer
- 💭 Requires type information
Rule Details
This rule prevents accidentally defaulting to the base Object .toString()
method.
- ❌ Incorrect
- ✅ Correct
// Passing an object or class instance to string concatenation:
'' + {};
class MyClass {}
const value = new MyClass();
value + '';
// Interpolation and manual .toString() calls too:
`Value: ${value}`;
({}.toString());
// These types all have useful .toString()s
'Text' + true;
`Value: ${123}`;
`Arrays too: ${[1, 2, 3]}`;
(() => {}).toString();
// Defining a custom .toString class is considered acceptable
class CustomToString {
toString() {
return 'Hello, world!';
}
}
`Value: ${new CustomToString()}`;
const literalWithToString = {
toString: () => 'Hello, world!',
};
`Value: ${literalWithToString}`;
Options
type Options = {
ignoredTypeNames?: string[];
};
const defaultOptions: Options = {
ignoredTypeNames: ['RegExp'],
};
ignoredTypeNames
A string array of type names to ignore, this is useful for types missing toString()
(but actually has toString()
).
There are some types missing toString()
in old version TypeScript, like RegExp
, URL
, URLSearchParams
etc.
The following patterns are considered correct with the default options { ignoredTypeNames: ["RegExp"] }
:
`${/regex/}`;
'' + /regex/;
/regex/.toString();
let value = /regex/;
value.toString();
let text = `${value}`;
When Not To Use It
If you don't mind "[object Object]"
in your strings, then you will not need this rule.