Co-authored-by: Oleksandr T <oleksandr.tarasiuk@outlook.com>
This commit is contained in:
Jake Bailey 2024-06-26 10:37:58 -07:00 коммит произвёл GitHub
Родитель ce2e60e4ea
Коммит 738bd605df
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
7 изменённых файлов: 159 добавлений и 3 удалений

Просмотреть файл

@ -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;
}