Javascript 无法将环境模块的导出用作TypeScript中的类型批注
我正在为一个相当大(800多个文件)的AMD 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
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
/// <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'.