mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Move check for module kind is ES2015 into grammar check; Use checkNonNullExpression and add tests
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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'.
|
||||
@@ -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);
|
||||
@@ -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'.
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user