Co-authored-by: Oleksandr T <oleksandr.tarasiuk@outlook.com>
This commit is contained in:
Родитель
ce2e60e4ea
Коммит
738bd605df
|
@ -4590,7 +4590,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
|||
}
|
||||
if (moduleResolutionKind === ModuleResolutionKind.Node16 || moduleResolutionKind === ModuleResolutionKind.NodeNext) {
|
||||
const isSyncImport = (currentSourceFile.impliedNodeFormat === ModuleKind.CommonJS && !findAncestor(location, isImportCall)) || !!findAncestor(location, isImportEqualsDeclaration);
|
||||
const overrideHost = findAncestor(location, l => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l)) as ImportTypeNode | ImportDeclaration | ExportDeclaration | undefined;
|
||||
const overrideHost = findAncestor(location, l => isImportTypeNode(l) || isExportDeclaration(l) || isImportDeclaration(l) || isJSDocImportTag(l)) as ImportTypeNode | ImportDeclaration | ExportDeclaration | JSDocImportTag | undefined;
|
||||
// An override clause will take effect for type-only imports and import types, and allows importing the types across formats, regardless of
|
||||
// normal mode restrictions
|
||||
if (isSyncImport && sourceFile.impliedNodeFormat === ModuleKind.ESNext && !hasResolutionModeOverride(overrideHost)) {
|
||||
|
|
|
@ -902,7 +902,7 @@ export function getModeForUsageLocation(file: { impliedNodeFormat?: ResolutionMo
|
|||
}
|
||||
|
||||
function getModeForUsageLocationWorker(file: { impliedNodeFormat?: ResolutionMode; }, usage: StringLiteralLike, compilerOptions?: CompilerOptions) {
|
||||
if ((isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent))) {
|
||||
if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent) || isJSDocImportTag(usage.parent)) {
|
||||
const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent);
|
||||
if (isTypeOnly) {
|
||||
const override = getResolutionModeOverride(usage.parent.attributes);
|
||||
|
|
|
@ -10850,7 +10850,7 @@ export function isExpandoPropertyDeclaration(declaration: Declaration | undefine
|
|||
}
|
||||
|
||||
/** @internal */
|
||||
export function hasResolutionModeOverride(node: ImportTypeNode | ImportDeclaration | ExportDeclaration | undefined) {
|
||||
export function hasResolutionModeOverride(node: ImportTypeNode | ImportDeclaration | ExportDeclaration | JSDocImportTag | undefined) {
|
||||
if (node === undefined) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
/a.js(8,5): error TS2322: Type '1' is not assignable to type '"module"'.
|
||||
/a.js(15,5): error TS2322: Type '1' is not assignable to type '"script"'.
|
||||
|
||||
|
||||
==== /node_modules/@types/foo/package.json (0 errors) ====
|
||||
{
|
||||
"name": "@types/foo",
|
||||
"version": "1.0.0",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./index.d.mts",
|
||||
"require": "./index.d.cts"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
==== /node_modules/@types/foo/index.d.mts (0 errors) ====
|
||||
export declare const Import: "module";
|
||||
|
||||
==== /node_modules/@types/foo/index.d.cts (0 errors) ====
|
||||
export declare const Require: "script";
|
||||
|
||||
==== /a.js (2 errors) ====
|
||||
/** @import { Import } from 'foo' with { 'resolution-mode': 'import' } */
|
||||
/** @import { Require } from 'foo' with { 'resolution-mode': 'require' } */
|
||||
|
||||
/**
|
||||
* @returns { Import }
|
||||
*/
|
||||
export function f1() {
|
||||
return 1;
|
||||
~~~~~~
|
||||
!!! error TS2322: Type '1' is not assignable to type '"module"'.
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns { Require }
|
||||
*/
|
||||
export function f2() {
|
||||
return 1;
|
||||
~~~~~~
|
||||
!!! error TS2322: Type '1' is not assignable to type '"script"'.
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
//// [tests/cases/conformance/jsdoc/importTag17.ts] ////
|
||||
|
||||
=== /node_modules/@types/foo/index.d.mts ===
|
||||
export declare const Import: "module";
|
||||
>Import : Symbol(Import, Decl(index.d.mts, 0, 20))
|
||||
|
||||
=== /node_modules/@types/foo/index.d.cts ===
|
||||
export declare const Require: "script";
|
||||
>Require : Symbol(Require, Decl(index.d.cts, 0, 20))
|
||||
|
||||
=== /a.js ===
|
||||
/** @import { Import } from 'foo' with { 'resolution-mode': 'import' } */
|
||||
/** @import { Require } from 'foo' with { 'resolution-mode': 'require' } */
|
||||
|
||||
/**
|
||||
* @returns { Import }
|
||||
*/
|
||||
export function f1() {
|
||||
>f1 : Symbol(f1, Decl(a.js, 0, 0))
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns { Require }
|
||||
*/
|
||||
export function f2() {
|
||||
>f2 : Symbol(f2, Decl(a.js, 8, 1))
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
//// [tests/cases/conformance/jsdoc/importTag17.ts] ////
|
||||
|
||||
=== /node_modules/@types/foo/index.d.mts ===
|
||||
export declare const Import: "module";
|
||||
>Import : "module"
|
||||
> : ^^^^^^^^
|
||||
|
||||
=== /node_modules/@types/foo/index.d.cts ===
|
||||
export declare const Require: "script";
|
||||
>Require : "script"
|
||||
> : ^^^^^^^^
|
||||
|
||||
=== /a.js ===
|
||||
/** @import { Import } from 'foo' with { 'resolution-mode': 'import' } */
|
||||
/** @import { Require } from 'foo' with { 'resolution-mode': 'require' } */
|
||||
|
||||
/**
|
||||
* @returns { Import }
|
||||
*/
|
||||
export function f1() {
|
||||
>f1 : () => "module"
|
||||
> : ^^^^^^^^^^^^^^
|
||||
|
||||
return 1;
|
||||
>1 : 1
|
||||
> : ^
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns { Require }
|
||||
*/
|
||||
export function f2() {
|
||||
>f2 : () => "script"
|
||||
> : ^^^^^^^^^^^^^^
|
||||
|
||||
return 1;
|
||||
>1 : 1
|
||||
> : ^
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
// @module: node16
|
||||
// @checkJs: true
|
||||
// @allowJs: true
|
||||
// @noEmit: true
|
||||
|
||||
// @Filename: /node_modules/@types/foo/package.json
|
||||
{
|
||||
"name": "@types/foo",
|
||||
"version": "1.0.0",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./index.d.mts",
|
||||
"require": "./index.d.cts"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// @Filename: /node_modules/@types/foo/index.d.mts
|
||||
export declare const Import: "module";
|
||||
|
||||
// @Filename: /node_modules/@types/foo/index.d.cts
|
||||
export declare const Require: "script";
|
||||
|
||||
// @Filename: /a.js
|
||||
/** @import { Import } from 'foo' with { 'resolution-mode': 'import' } */
|
||||
/** @import { Require } from 'foo' with { 'resolution-mode': 'require' } */
|
||||
|
||||
/**
|
||||
* @returns { Import }
|
||||
*/
|
||||
export function f1() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns { Require }
|
||||
*/
|
||||
export function f2() {
|
||||
return 1;
|
||||
}
|
Загрузка…
Ссылка в новой задаче