Javascript 无法将环境模块的导出用作TypeScript中的类型批注

Javascript 无法将环境模块的导出用作TypeScript中的类型批注,javascript,typescript,amd,js-amd,Javascript,Typescript,Amd,Js Amd,我正在为一个相当大(800多个文件)的AMD JavaScript库编写一个TypeScript类型定义。下面您可以看到一个片段: declare namespace myjslib { namespace shape { interface Shape { contains(p: Point): boolean; } class Point implements Shape { constructor(x: number, y: numbe

我正在为一个相当大(800多个文件)的AMD JavaScript库编写一个TypeScript类型定义。下面您可以看到一个片段:

declare namespace myjslib {
  namespace shape {
    interface Shape {
      contains(p: Point): boolean;
    }

    class Point implements Shape {
      constructor(x: number, y: number);
      contains(p: Point): boolean;
    }

    class Circle implements Shape {
      constructor(p: Point, radius: number);
      contains(p: Point): boolean;
    }
  }
}

declare module "myjslib/shape/Point" {
  export = myjslib.shape.Point;
}

declare module "myjslib/shape/Circle" {
  export = myjslib.shape.Circle;
}
我在名称空间中定义了类型。(请注意,myjslib不是库的真实名称:):

  • 从模块声明中可以看出,名称空间与AMD库中的模块ID非常对应
  • 我决定将这些类放入名称空间以避免冲突(cfr)。 )。如果我的库与其他JavaScript库结合使用,则像
    Point
    Circle
    这样的类名可能会发生冲突
然后,我尝试编写一个依赖于此类型定义文件的TypeScript应用程序:

/// <reference path="./myjslib.d.ts" />
import Point = require("myjslib/shape/Point");
import Circle = require("myjslib/shape/Circle");

import Circ = myjslib.shape.Circle;

let c1 = new Circle(new Point(1,3), 20);
let c2: Circle;
let c3: myjslib.shape.Circle;
let c4: Circ;

c1.contains(new Point(5,6));
c2 = c1;
c3 = c1;
c4 = c1;
显然,可以参考导入的
圆来创建圆。当您有权访问
Circle
构造函数时,import语句将起作用。但是,在声明该类型的变量时,
Circle
不能用作类型注释。也可以使用类型的完全限定名:编译器不会抱怨
c3
声明,因此编译器会找到并使用typescript定义文件。另外,如果我创建了一个别名
Circ
,那么类型系统就像一个符咒一样工作(声明
c4

据我所知,
importcircle=require(“myjslib/shape/Circle”)
语句也导入了类型信息。要使用中的术语,我希望
Circle
在该模块的类型声明空间中可用,但它不是。类型信息是通过TypeScript定义文件加载的:可以使用
myjslib
名称空间

总之:我必须编写代码,在其中我必须使用导入来创建特定类的实例,但是如果我想声明该类的变量,我必须使用完全限定的类型名。这使得编写代码非常混乱(而且冗长)。这有什么办法吗?这是预期的行为,还是我遇到了TypeScript编译器错误

>tsc --module amd app.ts
app.ts(8,9): error TS2304: Cannot find name 'Circle'.