diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 52ed8f1d77c..482bc94c150 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -7036,13 +7036,17 @@ namespace ts { || isPartOfTypeQuery(useSite) || isIdentifierInNonEmittingHeritageClause(useSite) || isPartOfPossiblyValidTypeOrAbstractComputedPropertyName(useSite) - || !isExpressionNode(useSite); + || !(isExpressionNode(useSite) || isShorthandPropertyNameUseSite(useSite)); } export function typeOnlyDeclarationIsExport(typeOnlyDeclaration: Node) { return typeOnlyDeclaration.kind === SyntaxKind.ExportSpecifier; } + function isShorthandPropertyNameUseSite(useSite: Node) { + return isIdentifier(useSite) && isShorthandPropertyAssignment(useSite.parent) && useSite.parent.name === useSite; + } + function isPartOfPossiblyValidTypeOrAbstractComputedPropertyName(node: Node) { while (node.kind === SyntaxKind.Identifier || node.kind === SyntaxKind.PropertyAccessExpression) { node = node.parent; diff --git a/tests/baselines/reference/importClause_default.errors.txt b/tests/baselines/reference/importClause_default.errors.txt index 66e742f8cd7..1d9e526c0f6 100644 --- a/tests/baselines/reference/importClause_default.errors.txt +++ b/tests/baselines/reference/importClause_default.errors.txt @@ -1,14 +1,19 @@ /b.ts(2,5): error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. +/b.ts(4,11): error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. ==== /a.ts (0 errors) ==== export default class A { a!: string } -==== /b.ts (1 errors) ==== +==== /b.ts (2 errors) ==== import type A from './a'; new A(); ~ !!! error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. !!! related TS1376 /b.ts:1:8: 'A' was imported here. let a: A = { a: '' }; + let b = { A }; + ~ +!!! error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. +!!! related TS1376 /b.ts:1:8: 'A' was imported here. \ No newline at end of file diff --git a/tests/baselines/reference/importClause_default.js b/tests/baselines/reference/importClause_default.js index d9e7c54331d..5b567f2600a 100644 --- a/tests/baselines/reference/importClause_default.js +++ b/tests/baselines/reference/importClause_default.js @@ -7,6 +7,7 @@ export default class A { a!: string } import type A from './a'; new A(); let a: A = { a: '' }; +let b = { A }; //// [a.js] @@ -23,3 +24,4 @@ exports["default"] = A; exports.__esModule = true; new A(); var a = { a: '' }; +var b = { A: A }; diff --git a/tests/baselines/reference/importClause_default.symbols b/tests/baselines/reference/importClause_default.symbols index 88d8f830234..79eb968e3fb 100644 --- a/tests/baselines/reference/importClause_default.symbols +++ b/tests/baselines/reference/importClause_default.symbols @@ -15,3 +15,7 @@ let a: A = { a: '' }; >A : Symbol(A, Decl(b.ts, 0, 6)) >a : Symbol(a, Decl(b.ts, 2, 12)) +let b = { A }; +>b : Symbol(b, Decl(b.ts, 3, 3)) +>A : Symbol(A, Decl(b.ts, 3, 9)) + diff --git a/tests/baselines/reference/importClause_default.types b/tests/baselines/reference/importClause_default.types index f924c2c22f9..27ac18e513d 100644 --- a/tests/baselines/reference/importClause_default.types +++ b/tests/baselines/reference/importClause_default.types @@ -17,3 +17,8 @@ let a: A = { a: '' }; >a : string >'' : "" +let b = { A }; +>b : { A: typeof A; } +>{ A } : { A: typeof A; } +>A : typeof A + diff --git a/tests/baselines/reference/importClause_namedImports.errors.txt b/tests/baselines/reference/importClause_namedImports.errors.txt index b33a4fe5bc6..9fb5820772e 100644 --- a/tests/baselines/reference/importClause_namedImports.errors.txt +++ b/tests/baselines/reference/importClause_namedImports.errors.txt @@ -1,4 +1,5 @@ /d.ts(2,5): error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. +/d.ts(6,13): error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. ==== /abc.ts (0 errors) ==== @@ -6,7 +7,7 @@ export type B = { b: string }; export const C = ""; -==== /d.ts (1 errors) ==== +==== /d.ts (2 errors) ==== import type { A, B, C } from './abc'; new A(); ~ @@ -15,4 +16,8 @@ declare let a: A; declare let b: B; b.b; + const c = { A }; + ~ +!!! error TS1361: 'A' cannot be used as a value because it was imported using 'import type'. +!!! related TS1376 /d.ts:1:15: 'A' was imported here. \ No newline at end of file diff --git a/tests/baselines/reference/importClause_namedImports.js b/tests/baselines/reference/importClause_namedImports.js index 710ee5ad314..2200bf42a52 100644 --- a/tests/baselines/reference/importClause_namedImports.js +++ b/tests/baselines/reference/importClause_namedImports.js @@ -11,6 +11,7 @@ new A(); declare let a: A; declare let b: B; b.b; +const c = { A }; //// [abc.js] @@ -29,3 +30,4 @@ exports.C = ""; exports.__esModule = true; new A(); b.b; +var c = { A: A }; diff --git a/tests/baselines/reference/importClause_namedImports.symbols b/tests/baselines/reference/importClause_namedImports.symbols index 077b86f4c01..ab3d2b2729d 100644 --- a/tests/baselines/reference/importClause_namedImports.symbols +++ b/tests/baselines/reference/importClause_namedImports.symbols @@ -31,3 +31,7 @@ b.b; >b : Symbol(b, Decl(d.ts, 3, 11)) >b : Symbol(b, Decl(abc.ts, 1, 18)) +const c = { A }; +>c : Symbol(c, Decl(d.ts, 5, 5)) +>A : Symbol(A, Decl(d.ts, 5, 11)) + diff --git a/tests/baselines/reference/importClause_namedImports.types b/tests/baselines/reference/importClause_namedImports.types index 8a96772a677..64c6c12b388 100644 --- a/tests/baselines/reference/importClause_namedImports.types +++ b/tests/baselines/reference/importClause_namedImports.types @@ -31,3 +31,8 @@ b.b; >b : B >b : string +const c = { A }; +>c : { A: typeof A; } +>{ A } : { A: typeof A; } +>A : typeof A + diff --git a/tests/baselines/reference/importClause_namespaceImport.errors.txt b/tests/baselines/reference/importClause_namespaceImport.errors.txt index a4c543d7f96..3ec8012b8af 100644 --- a/tests/baselines/reference/importClause_namespaceImport.errors.txt +++ b/tests/baselines/reference/importClause_namespaceImport.errors.txt @@ -3,6 +3,7 @@ /b.ts(4,14): error TS2694: Namespace '"/a"' has no exported member 'Value'. /b.ts(5,7): error TS2741: Property 'a' is missing in type '{}' but required in type 'A'. /b.ts(6,7): error TS2741: Property 'b' is missing in type '{}' but required in type 'B'. +/b.ts(8,13): error TS1361: 'types' cannot be used as a value because it was imported using 'import type'. ==== /a.ts (0 errors) ==== @@ -11,7 +12,7 @@ export type C = T; export const Value = {}; -==== /b.ts (5 errors) ==== +==== /b.ts (6 errors) ==== import type * as types from './a'; types; ~~~~~ @@ -33,4 +34,8 @@ !!! error TS2741: Property 'b' is missing in type '{}' but required in type 'B'. !!! related TS2728 /a.ts:2:18: 'b' is declared here. const c: types.C = ""; + const d = { types }; + ~~~~~ +!!! error TS1361: 'types' cannot be used as a value because it was imported using 'import type'. +!!! related TS1376 /b.ts:1:13: 'types' was imported here. \ No newline at end of file diff --git a/tests/baselines/reference/importClause_namespaceImport.js b/tests/baselines/reference/importClause_namespaceImport.js index d449408e457..a0ddb79f02b 100644 --- a/tests/baselines/reference/importClause_namespaceImport.js +++ b/tests/baselines/reference/importClause_namespaceImport.js @@ -14,6 +14,7 @@ let v: types.Value; const a: types.A = {}; const b: types.B = {}; const c: types.C = ""; +const d = { types }; //// [a.js] @@ -42,3 +43,4 @@ var v; var a = {}; var b = {}; var c = ""; +var d = { types: types }; diff --git a/tests/baselines/reference/importClause_namespaceImport.symbols b/tests/baselines/reference/importClause_namespaceImport.symbols index f2133f201cb..fed01bae9d9 100644 --- a/tests/baselines/reference/importClause_namespaceImport.symbols +++ b/tests/baselines/reference/importClause_namespaceImport.symbols @@ -46,3 +46,7 @@ const c: types.C = ""; >types : Symbol(types, Decl(b.ts, 0, 11)) >C : Symbol(types.C, Decl(a.ts, 1, 29)) +const d = { types }; +>d : Symbol(d, Decl(b.ts, 7, 5)) +>types : Symbol(types, Decl(b.ts, 7, 11)) + diff --git a/tests/baselines/reference/importClause_namespaceImport.types b/tests/baselines/reference/importClause_namespaceImport.types index 471bf173677..e0f0c7c3575 100644 --- a/tests/baselines/reference/importClause_namespaceImport.types +++ b/tests/baselines/reference/importClause_namespaceImport.types @@ -45,3 +45,8 @@ const c: types.C = ""; >types : any >"" : "" +const d = { types }; +>d : { types: typeof types; } +>{ types } : { types: typeof types; } +>types : typeof types + diff --git a/tests/cases/conformance/externalModules/typeOnly/importClause_default.ts b/tests/cases/conformance/externalModules/typeOnly/importClause_default.ts index b3f5a5259e4..d91526b445d 100644 --- a/tests/cases/conformance/externalModules/typeOnly/importClause_default.ts +++ b/tests/cases/conformance/externalModules/typeOnly/importClause_default.ts @@ -5,3 +5,4 @@ export default class A { a!: string } import type A from './a'; new A(); let a: A = { a: '' }; +let b = { A }; diff --git a/tests/cases/conformance/externalModules/typeOnly/importClause_namedImports.ts b/tests/cases/conformance/externalModules/typeOnly/importClause_namedImports.ts index c2642701a35..ff48b668781 100644 --- a/tests/cases/conformance/externalModules/typeOnly/importClause_namedImports.ts +++ b/tests/cases/conformance/externalModules/typeOnly/importClause_namedImports.ts @@ -9,3 +9,4 @@ new A(); declare let a: A; declare let b: B; b.b; +const c = { A }; diff --git a/tests/cases/conformance/externalModules/typeOnly/importClause_namespaceImport.ts b/tests/cases/conformance/externalModules/typeOnly/importClause_namespaceImport.ts index d9a6313c4d1..0370bae9a42 100644 --- a/tests/cases/conformance/externalModules/typeOnly/importClause_namespaceImport.ts +++ b/tests/cases/conformance/externalModules/typeOnly/importClause_namespaceImport.ts @@ -12,3 +12,4 @@ let v: types.Value; const a: types.A = {}; const b: types.B = {}; const c: types.C = ""; +const d = { types };