使用复杂的.d.ts文件(chrome-app.d.ts)

时间:2016-01-30 01:33:25

标签: typescript

大多数.d.ts文件都很简单,例如jQuery.d.ts。但是现在我已经遇到了chrome-app.d.ts并且不清楚(对我来说)这个打字文件是如何导入的。 chrome-app.d.ts包含一系列模块定义,每个定义包含接口和导出的函数。这是一个片段:

declare module chrome.app.runtime {
    interface LaunchData {
        id?: string;
        ......
        ......
}

declare module chrome.app.window {
    interface ContentBounds {
        left?: number;
        ......
        ......
    export function current(): AppWindow;
    export function get(id: string): AppWindow;
    export function getAll(): AppWindow[];
}

等等,共有七个模块。模块名称未引用。没有顶级出口申报。

如何在我的ts中使用(即导入)此定义文件?我想使用 chrome.app.window.get()等等,继续使用Goog文档中的JS定义。回答Using a Typescript .d.ts file that doesn't declare a module几乎适用于我的问题。在该解决方案中,添加带有引用模块名称的补充.d.ts文件:

declare module 'chrome.app.runtime' { export = chrome.app.runtime; }

确实我可以用这个:

import chromeAppRuntime = require('chrome.app.runtime');

但我不能用这个:

import chrome.app.runtime = require('chrome.app.runtime');

这样就可以了,保留工具链:

import fooBar = require('chrome.app.runtime');
var chrome = {app: {runtime: fooBar}};

有什么更简单的方法:)

1 个答案:

答案 0 :(得分:2)

chrome对象是全局命名空间对象,而不是某些外部模块。此chrome-app.d.ts文件描述了Chrome扩展程序范围内的全局对象。它使用(不鼓励/弃用)module关键字,这与较新版本的TypeScript中较少混淆的namespace关键字相同。换句话说,这个d.ts文件在全局范围内声明了命名空间对象。

要使用此d.ts文件,您不要导入它,将它与您自己的代码一起直接传递给编译器:

tsc my/extension.ts chrome-app.d.ts

然后,您的代码将直接使用chrome对象,就像直接从DOM中运行的脚本的全局范围使用windowdocument一样。 (TypeScript编译器在您运行它时隐式包含捆绑的lib.d.ts,它暴露了DOM API。)