Visual studio TypeScript AMD无法解析具有自定义require.config baseUrl的外部模块

Visual studio TypeScript AMD无法解析具有自定义require.config baseUrl的外部模块,visual-studio,requirejs,typescript,amd,Visual Studio,Requirejs,Typescript,Amd,我对typescript+requirejs有一些问题。 我有两个项目(主项目和带有单元测试的项目)。 看起来是这样的: 模块a.ts: 模块B.ts: RequireFig.js: myTest.ts: testRequreConfig.js: index.html: 在*.d.ts文件中-然后我们就可以使用它了。但在实际项目中,我们有很多类型脚本文件,不可能手动为每个文件编写“declare”。 有什么办法处理吗? 主要问题是,我们无法编辑require.conf

我对typescript+requirejs有一些问题。 我有两个项目(主项目和带有单元测试的项目)。 看起来是这样的:


模块a.ts:


模块B.ts:


RequireFig.js:


myTest.ts:


testRequreConfig.js:


index.html:


在*.d.ts文件中-然后我们就可以使用它了。但在实际项目中,我们有很多类型脚本文件,不可能手动为每个文件编写“declare”。 有什么办法处理吗? 主要问题是,我们无法编辑require.config(出于某些原因)

可以让tsc.exe了解require.config吗

可以让tsc.exe了解require.config吗


很遗憾,没有。您的两个选项是创建def来告诉typescript有关配置的信息或使用完整的相对路径。

我找到了一个解决方法,可能也会对您有所帮助

我注意到jquery.d.ts的底部有以下代码:

declare module "jquery" {
    export = $;
}
declare var jQuery: JQueryStatic;
declare var $: JQueryStatic;
当TypeScript
import x=require()时,可以找到环境模块声明语句


使用这种技术,您可以定义您的类型,然后附加一个环境模块声明,该声明导出这些类型并在require中识别。

对于我来说,完整路径不是解决方案,因为在项目中,我们有模块依赖项,这些依赖项在运行时由requirejs通过其自定义baseUrl解析(我们导入模块,该模块导入另一个模块,依此类推)。@ValeryPetrov完整相对路径相对路径和绝对路径都不是问题的解决方案,因为我们在require.config中有自定义的baseUrl。因此,如果我们在import…=require(…)中放入完整相对路径,requirejs将找不到任何模块如果我们在require(…)中设置了正确的requirejs路径(相对于baseUrl和其他require.config),那么所有的问题都是因为自定义baseUrl-tsc对它一无所知,也找不到任何模块@ValeryPetrov您是否都找到了解决方案?正在努力解决完全相同的问题。@YngvarKristiansen相对路径始终与当前文件相对,不应受到baseUrl的影响。我使用此方法(并与其他人一起维护):当前的解决方法是为每个模块编写.d.ts文件,并使用自定义名称声明模块“moduleB”{…}(相对于require.config baseUrl)。是否可以使用自定义名称字符串的环境模块声明使tsc.exe生成.d.ts?如果我们可以在tsc生成的.d.ts文件的内容周围添加declare module%some_string%{和}(并删除其中的所有declare关键字),那将是非常棒的。好的,完成了tsc生成的“生成后”事件和更正.d.ts文件(使用相对路径对应于require.config中的baseUrl的declare模块包装)。这是一个可行的解决方案,但仍然只是一个解决方案。继续寻找更好的解决方案。
import moduleA = require('moduleA');

export class B {
    private a: moduleA.A;

    constructor(a: moduleA.A) {
        this.a = a;
    }

    getSomeThing() {
        return this.a.someThing;
    }
}

export var bInst = new B(moduleA.aInst);
require.config({
    baseUrl: "/app",
});
import moduleB = require('moduleB');

QUnit.test('my test', () => {
    QUnit.equal("hello from module A", moduleB.bInst.getSomeThing());
});
require.config({
    baseUrl: "../Base/app",
});
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">

    <link rel="stylesheet" href="Content/qunit.css" type="text/css" />
    <script type="text/javascript" src="Scripts/qunit.js"></script>

    <script src="Scripts/require.js"></script>
    <script src="test/testRequreConfig.js"></script>
</head>
<body>
    <h1 id="qunit-header">Unit Tests</h1>
    <h2 id="qunit-banner"></h2>
    <h2 id="qunit-userAgent"></h2>
    <ol id="qunit-tests"></ol>
    <div id="qunit-fixture">test markup, will be hidden</div>

    <script type="text/javascript">
        (function () {
            QUnit.config.autostart = false;
            require(['test/myTest.js'], QUnit.start);
        }());
    </script>
</body>
</html>
declare module "moduleB" {
 
    export  ...
}
declare module "jquery" {
    export = $;
}
declare var jQuery: JQueryStatic;
declare var $: JQueryStatic;