如何在声明文件中将实例与命名空间合并?

时间:2017-11-14 17:46:17

标签: javascript typescript

如何创建代表以下JavaScript API的.d.ts文件?

  • Loader是一个未全局导出的类
  • loader全局导出,是Loader
  • 的实例
  • loader.LoaderLoader类本身
  • Loader有一个静态方法create,用于创建Loader
  • 的实例

所以基本上loader的行为类似于包含类Loader的命名空间,但也是Loader的实例。以下方法不起作用,因为TypeScript不会将名称空间与值合并:

declare namespace loader {
    class Loader {
        id: number;
        name: string;
        load(url: string): any;

        static create(name: string, parent?: Loader): Loader;
    } 
}

// This doesn't work, because a namespace cannot be merged with a value:
declare const loader: loader.Loader;

使用JavaScript中的API如下所示:

// Call load() on the default Loader instance
loader.load('/foo/index'); 

// loader.Loader is a class, and loader is an instance of it
if(loader instanceof loader.Loader) {  
    console.log('Yes, loader is a Loader');
}

// Create a new Loader instance
var myLoader = loader.Loader.create('my-loader'); 

// Call load on this Loader instance
myLoader.load('/bar/something'); 

// myLoader is also an instance loader.Loader
if(myLoader instanceof loader.Loader) {  
    console.log('Yes, myLoader is a Loader');
}

1 个答案:

答案 0 :(得分:1)

我不太明白当你说" Loader没有全球出口时你是什么意思"和#34;装载机全球出口"。一件事可以从模块中导出,也可以在其他模块中导入,或者不导出 - 没有"全局导出"的概念。另一方面,可以声明一个东西存在于全局命名空间中,就像全局变量一样,可以在每个模块中使用,而无需显式导入任何内容。

如果希望从模块导出loader具有额外Loader属性,则无需声明命名空间 - 在声明{时,可以使用交集类型添加Loader属性{1}}实例:

<强> loader.d.ts

loader

在导入declare class Loader { id: number; name: string; load(url: string): any; static create(name: string, parent?: Loader): Loader; } declare const loader: Loader & { Loader: typeof Loader }; export {loader}; // Loader is not exported 之后编译所有示例:

loader