diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1089e9d2c7d..8eb163e7aa8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15580,12 +15580,8 @@ namespace ts { return createPromiseReturnType(node, anyType); } - if (modulekind === ModuleKind.ES2015) { - grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules); - } - const specifier = node.arguments[0]; - const specifierType = checkExpression(specifier); + const specifierType = checkNonNullExpression(specifier); if (!isTypeAssignableTo(specifierType, stringType)) { error(specifier, Diagnostics.Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0, typeToString(specifierType)); } @@ -24081,6 +24077,10 @@ namespace ts { if (isSpreadExpression(arguments[0])) { return grammarErrorOnNode(arguments[0], Diagnostics.Specifier_of_dynamic_import_cannot_be_spread_element); } + + if (modulekind === ModuleKind.ES2015) { + grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules); + } } } } \ No newline at end of file diff --git a/tests/baselines/reference/importCallExpression5ES2018.errors.txt b/tests/baselines/reference/importCallExpression5ES2018.errors.txt new file mode 100644 index 00000000000..372fda0a685 --- /dev/null +++ b/tests/baselines/reference/importCallExpression5ES2018.errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/es2018/dynamicImport/2.ts(3,23): error TS2532: Object is possibly 'undefined'. +tests/cases/conformance/es2018/dynamicImport/2.ts(4,24): error TS2532: Object is possibly 'undefined'. +tests/cases/conformance/es2018/dynamicImport/2.ts(5,24): error TS2531: Object is possibly 'null'. +tests/cases/conformance/es2018/dynamicImport/2.ts(6,24): error TS2531: Object is possibly 'null'. + + +==== tests/cases/conformance/es2018/dynamicImport/0.ts (0 errors) ==== + export class B { + print() { return "I am B"} + } + + export function foo() { return "foo" } + +==== tests/cases/conformance/es2018/dynamicImport/1.ts (0 errors) ==== + export function backup() { return "backup"; } + +==== tests/cases/conformance/es2018/dynamicImport/2.ts (4 errors) ==== + declare function bar(): boolean; + const specify = bar() ? "./0" : undefined; + let myModule = import(specify); + ~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + let myModule1 = import(undefined); + ~~~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + let myModule2 = import(bar() ? "./1" : null); + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2531: Object is possibly 'null'. + let myModule3 = import(null); + ~~~~ +!!! error TS2531: Object is possibly 'null'. \ No newline at end of file diff --git a/tests/baselines/reference/importCallExpression5ES2018.js b/tests/baselines/reference/importCallExpression5ES2018.js new file mode 100644 index 00000000000..802988cedbc --- /dev/null +++ b/tests/baselines/reference/importCallExpression5ES2018.js @@ -0,0 +1,33 @@ +//// [tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts] //// + +//// [0.ts] +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +//// [1.ts] +export function backup() { return "backup"; } + +//// [2.ts] +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); + +//// [0.js] +export class B { + print() { return "I am B"; } +} +export function foo() { return "foo"; } +//// [1.js] +export function backup() { return "backup"; } +//// [2.js] +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); diff --git a/tests/baselines/reference/importCallExpression6ES2018.errors.txt b/tests/baselines/reference/importCallExpression6ES2018.errors.txt new file mode 100644 index 00000000000..33f93ef4d39 --- /dev/null +++ b/tests/baselines/reference/importCallExpression6ES2018.errors.txt @@ -0,0 +1,25 @@ +tests/cases/conformance/es2018/dynamicImport/2.ts(4,24): error TS2532: Object is possibly 'undefined'. +tests/cases/conformance/es2018/dynamicImport/2.ts(6,24): error TS2531: Object is possibly 'null'. + + +==== tests/cases/conformance/es2018/dynamicImport/0.ts (0 errors) ==== + export class B { + print() { return "I am B"} + } + + export function foo() { return "foo" } + +==== tests/cases/conformance/es2018/dynamicImport/1.ts (0 errors) ==== + export function backup() { return "backup"; } + +==== tests/cases/conformance/es2018/dynamicImport/2.ts (2 errors) ==== + declare function bar(): boolean; + const specify = bar() ? "./0" : undefined; + let myModule = import(specify); + let myModule1 = import(undefined); + ~~~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + let myModule2 = import(bar() ? "./1" : null); + let myModule3 = import(null); + ~~~~ +!!! error TS2531: Object is possibly 'null'. \ No newline at end of file diff --git a/tests/baselines/reference/importCallExpression6ES2018.js b/tests/baselines/reference/importCallExpression6ES2018.js new file mode 100644 index 00000000000..cde74278f33 --- /dev/null +++ b/tests/baselines/reference/importCallExpression6ES2018.js @@ -0,0 +1,33 @@ +//// [tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts] //// + +//// [0.ts] +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +//// [1.ts] +export function backup() { return "backup"; } + +//// [2.ts] +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); + +//// [0.js] +export class B { + print() { return "I am B"; } +} +export function foo() { return "foo"; } +//// [1.js] +export function backup() { return "backup"; } +//// [2.js] +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); diff --git a/tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts b/tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts new file mode 100644 index 00000000000..254e99f3907 --- /dev/null +++ b/tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts @@ -0,0 +1,20 @@ +// @module: es2018 +// @target: esnext +// @strictNullChecks: true +// @filename: 0.ts +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +// @filename: 1.ts +export function backup() { return "backup"; } + +// @filename: 2.ts +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); \ No newline at end of file diff --git a/tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts b/tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts new file mode 100644 index 00000000000..8c1a1071fbc --- /dev/null +++ b/tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts @@ -0,0 +1,19 @@ +// @module: es2018 +// @target: esnext +// @filename: 0.ts +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +// @filename: 1.ts +export function backup() { return "backup"; } + +// @filename: 2.ts +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); \ No newline at end of file