Typescript 可以导入 CommonJS 模块吗?

Can Typescript import CommonJS Modules?

我有这个文件:

//foo.js
var foo = function () {
    return "foo";
}; 

module.exports = foo;

所以,我想将它导入到我的 Typescript 文件中。我试过这个

//typescript.ts
import * as foo from ("./foo");

没用。我读到了这个 'ambient' 模块,所以我添加了这个

//typescript.ts
/// <reference path="./foo.d.ts" />
import * as foo from ("./foo");

并且我在同一文件夹中添加了一个"foo.d.ts"文件,目的是让打字稿知道我导入的函数的类型:

declare module "foo" 
{
    function foo(): string
    export = foo;
}

运气不好。

我认为问题出在导入语法上(es6 和 commonjs 模块不能使用相同的语法,对吧?)。所以我这样做了。

import foo = require("./foo");

您可能猜到了,这也不起作用。

当我使用 npm install d3 将它安装为节点模块并引用其 d.ts 文件时,我已经能够导入 d3 并成功使用它。我用这段代码做到了:

import * as d3 from "d3";

我无法对任何其他模块(jquery、box2d、box2d-commonjs 等)或我自己的库执行相同的操作,如上所示。我是 Typescript 的新手,所以我可能遗漏了一些非常明显的东西,但我自己却无法弄清楚。

事实证明这很明显:您必须使用 --allowJs 选项。这对我有用:

tsc --moduleResolution "node" --module "commonjs"  --allowJs main.ts

尽管如此,我仍然不明白为什么 d3 可以工作而其他库没有。