From fc08ff5a36cd48a7b619f8c37dd42e3fa89389af Mon Sep 17 00:00:00 2001 From: Jack Williams Date: Thu, 1 Mar 2018 03:07:53 +0000 Subject: [PATCH] Check for symbol types in template expressions --- src/compiler/checker.ts | 4 ++- .../noImplicitSymbolToString.errors.txt | 21 +++++++++++++++ .../reference/noImplicitSymbolToString.js | 18 +++++++++++++ .../noImplicitSymbolToString.symbols | 21 +++++++++++++++ .../reference/noImplicitSymbolToString.types | 26 +++++++++++++++++++ .../compiler/noImplicitSymbolToString.ts | 8 ++++++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/noImplicitSymbolToString.errors.txt create mode 100644 tests/baselines/reference/noImplicitSymbolToString.js create mode 100644 tests/baselines/reference/noImplicitSymbolToString.symbols create mode 100644 tests/baselines/reference/noImplicitSymbolToString.types create mode 100644 tests/cases/compiler/noImplicitSymbolToString.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9579ba80d0f..19e5e2a880c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19361,7 +19361,9 @@ namespace ts { // A place where we actually *are* concerned with the expressions' types are // in tagged templates. forEach(node.templateSpans, templateSpan => { - checkExpression(templateSpan.expression); + if (maybeTypeOfKind(checkExpression(templateSpan.expression), TypeFlags.ESSymbolLike)) { + error(templateSpan.expression, Diagnostics.Type_0_cannot_be_converted_to_type_1, typeToString(esSymbolType), typeToString(stringType)); + } }); return stringType; diff --git a/tests/baselines/reference/noImplicitSymbolToString.errors.txt b/tests/baselines/reference/noImplicitSymbolToString.errors.txt new file mode 100644 index 00000000000..43f5bb88864 --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.errors.txt @@ -0,0 +1,21 @@ +tests/cases/compiler/noImplicitSymbolToString.ts(6,30): error TS2352: Type 'symbol' cannot be converted to type 'string'. +tests/cases/compiler/noImplicitSymbolToString.ts(7,30): error TS2469: The '+' operator cannot be applied to type 'symbol'. +tests/cases/compiler/noImplicitSymbolToString.ts(8,8): error TS2469: The '+=' operator cannot be applied to type 'symbol'. + + +==== tests/cases/compiler/noImplicitSymbolToString.ts (3 errors) ==== + // Fix #19666 + + let symbol!: symbol; + let str = "hello "; + + const templateStr = `hello ${symbol}`; + ~~~~~~ +!!! error TS2352: Type 'symbol' cannot be converted to type 'string'. + const appendStr = "hello " + symbol; + ~~~~~~ +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. + str += symbol; + ~~~~~~ +!!! error TS2469: The '+=' operator cannot be applied to type 'symbol'. + \ No newline at end of file diff --git a/tests/baselines/reference/noImplicitSymbolToString.js b/tests/baselines/reference/noImplicitSymbolToString.js new file mode 100644 index 00000000000..c7e62c7a86e --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.js @@ -0,0 +1,18 @@ +//// [noImplicitSymbolToString.ts] +// Fix #19666 + +let symbol!: symbol; +let str = "hello "; + +const templateStr = `hello ${symbol}`; +const appendStr = "hello " + symbol; +str += symbol; + + +//// [noImplicitSymbolToString.js] +// Fix #19666 +var symbol; +var str = "hello "; +var templateStr = "hello " + symbol; +var appendStr = "hello " + symbol; +str += symbol; diff --git a/tests/baselines/reference/noImplicitSymbolToString.symbols b/tests/baselines/reference/noImplicitSymbolToString.symbols new file mode 100644 index 00000000000..a043aecefb1 --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/noImplicitSymbolToString.ts === +// Fix #19666 + +let symbol!: symbol; +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + +let str = "hello "; +>str : Symbol(str, Decl(noImplicitSymbolToString.ts, 3, 3)) + +const templateStr = `hello ${symbol}`; +>templateStr : Symbol(templateStr, Decl(noImplicitSymbolToString.ts, 5, 5)) +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + +const appendStr = "hello " + symbol; +>appendStr : Symbol(appendStr, Decl(noImplicitSymbolToString.ts, 6, 5)) +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + +str += symbol; +>str : Symbol(str, Decl(noImplicitSymbolToString.ts, 3, 3)) +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + diff --git a/tests/baselines/reference/noImplicitSymbolToString.types b/tests/baselines/reference/noImplicitSymbolToString.types new file mode 100644 index 00000000000..45a69c5e950 --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.types @@ -0,0 +1,26 @@ +=== tests/cases/compiler/noImplicitSymbolToString.ts === +// Fix #19666 + +let symbol!: symbol; +>symbol : symbol + +let str = "hello "; +>str : string +>"hello " : "hello " + +const templateStr = `hello ${symbol}`; +>templateStr : string +>`hello ${symbol}` : string +>symbol : symbol + +const appendStr = "hello " + symbol; +>appendStr : string +>"hello " + symbol : string +>"hello " : "hello " +>symbol : symbol + +str += symbol; +>str += symbol : string +>str : string +>symbol : symbol + diff --git a/tests/cases/compiler/noImplicitSymbolToString.ts b/tests/cases/compiler/noImplicitSymbolToString.ts new file mode 100644 index 00000000000..5340e2cd972 --- /dev/null +++ b/tests/cases/compiler/noImplicitSymbolToString.ts @@ -0,0 +1,8 @@ +// Fix #19666 + +let symbol!: symbol; +let str = "hello "; + +const templateStr = `hello ${symbol}`; +const appendStr = "hello " + symbol; +str += symbol;