Typescript中没有import语句的外部模块

6tqwzwtp  于 2023-01-03  发布在  TypeScript
关注(0)|答案(3)|浏览(223)

当你在Typescript文件中添加一条import语句时,这个文件就被认为是一个外部模块,所以这不是一个问题:

    • 文件.1.ts**
import { Type } from '...';
let whatever = 123;
...
    • 文件.2.ts**
import { Type } from '...';
let whatever = 234;
...

这是可行的,但是一旦删除了这两个import语句,这些文件就不再被认为是模块,两个同名变量就变成了全局变量,相互干扰。

问题

如何对没有任何import语句的源文件强制模块化?

scyqe7ek

scyqe7ek1#

需要import或者export什么的,建议导出一个undefined的值:

export let undefined;

编译器不为此指令生成代码。

zaqlnxep

zaqlnxep2#

小心这是相当hacky但是...

给定:

  • 它不是一个模块,

不导出任何内容
也不输出任何东西,
并且无法修改
你不能把它包含在项目中,否则tsc会抱怨重复 *
所以你不能设置它的状态
或..传递参数
并且...您无法读取其输出/结果
那么...你是因为它的副作用才想要它的

// file: notamoduleA.ts:
let x = "x";
(global as any).x = x;

// file: notamoduleB.ts:
let x = "y";
(global as any).x = x;

把它做成一个模块

// file: index.ts:

import * as ts from "typescript";
import * as fs from "fs";

eval(
    ts.transpileModule(
        fs.readFileSync(
            "./external/notamoduleA.ts", "utf8")+
             "\n export = {name: 'A'}",{
                 // options ...
             }             
    ).outputText
);

console.log((global as any).x);

eval(
    ts.transpileModule(
        fs.readFileSync(
            "./external/notamoduleB.ts", "utf8")+
             "\n export = {name: 'B'}",{
                 // options ...
             }             
    ).outputText
);

console.log((global as any).x);

或者在浏览器中绑定这种代码
在运行时创建一个脚本元素并加载它

6mzjoqzu

6mzjoqzu3#

从TypeScript 4.7开始,这个问题可以通过tsconfig.json中的"moduleDetection": "force"解决:

{
  "compilerOptions": {
    // ... Various options here, such as module ...
    "moduleDetection": "force"
  }
}

Reference: https://www.typescriptlang.org/tsconfig#moduleDetection
导致此配置的原始Github问题:https://github.com/microsoft/TypeScript/issues/14279

相关问题