diff --git a/packages/eslint-plugin/src/rules/no-base-to-string.ts b/packages/eslint-plugin/src/rules/no-base-to-string.ts index 364d7aa0194..5a07edc11c3 100644 --- a/packages/eslint-plugin/src/rules/no-base-to-string.ts +++ b/packages/eslint-plugin/src/rules/no-base-to-string.ts @@ -123,10 +123,27 @@ export default util.createRule({ return Usefulness.Never; } + let allSubtypesUseful = true; + let someSubtypeUseful = false; + for (const subType of type.types) { - if (collectToStringCertainty(subType) !== Usefulness.Never) { - return Usefulness.Sometimes; + const subtypeUsefulness = collectToStringCertainty(subType); + + if (subtypeUsefulness !== Usefulness.Always && allSubtypesUseful) { + allSubtypesUseful = false; } + + if (subtypeUsefulness !== Usefulness.Never && !someSubtypeUseful) { + someSubtypeUseful = true; + } + } + + if (allSubtypesUseful && someSubtypeUseful) { + return Usefulness.Always; + } + + if (someSubtypeUseful) { + return Usefulness.Sometimes; } return Usefulness.Never; diff --git a/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts b/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts index bca40cf29dd..99d94943767 100644 --- a/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts +++ b/packages/eslint-plugin/tests/rules/no-base-to-string.test.ts @@ -78,6 +78,14 @@ const literalWithToString = { toString: () => 'Hello, world!', }; '' + literalToString; + `, + ` +const printer = (inVar: string | number | boolean) => { + inVar.toString(); +}; +printer(''); +printer(1); +printer(true); `, 'let _ = {} * {};', 'let _ = {} / {};',