2

Dojo 声明一个 i18n 包,如下所示:

define({root: { "fooName": "fooValue" });

在打字稿中,我可以这样做:

var root = { root: { "uom": { "Degrees": "Degrees" } } };
export = root;

但据我所知, tsc -d test.ts 并没有产生任何有用的东西:

declare var root: {
    root: {
        "uom": {
            "Degrees": string;
        };
    };
};
export = root;

我真正想要的是让 tsc 生成一个可用的界面:

interface IResx {
    "uom": {
        "Degrees": string;
    };
};

我忽略了什么吗?我们如何从这样的模块生成可重用的 d.ts 文件?

4

4 回答 4

0

您必须手动编写定义文件。或者只是发送您的 .ts 文件。:) TSC 不会生成 .d.ts 文件,并且迄今为止没有实用程序可以执行此操作。

.d.ts 文件通常是在原始 .js 文件不是从 TypeScript 创建时创建的。

于 2013-10-28T19:01:45.637 回答
0

如果 javascript 库没有现有的 .d.ts 定义文件(Dojo 似乎就是这种情况),您可以使用环境声明来抑制 typescript 错误。

首先,您可以这样做:

declare function define(x);

这将在您使用时摆脱编译器错误

define({root: { "fooName": "fooValue" }});

然而,它并没有过多地说明 define() 的期望。您可以扩展声明以提供更多信息。(注意,我不熟悉道场,所以这些只是例子)

// specify that define doesn't return anything
declare function define(x): void;

// be explicit that parameter can be type 'any'
declare function define(x: any): void;

// declare any additional optional parameters, too
declare function define(x: any, y?: number, z? string): void;

最后,您可以在需要特定结构时定义接口:

interface DojoI18nDefinition {
    root: { [key: string]: string; };
}

declare function define(x: DojoI18nDefinition): void;

现在 typescript 知道 x 是什么,如果使用错误会报错。现在,如果您将其保存到 dojo.d.ts,您将拥有一些可重用的东西。这就是现有 .d.ts 文件所做的一切;困难在于制作完整、准确并能处理任何极端情况的东西。

于 2013-10-28T21:57:46.880 回答
0

在 TypeScript 中描述行为的方式不止一种。生成的是-d明智的行为,但更容易手动编写,并且更开放

于 2013-10-28T22:31:03.867 回答
0

我最终编写了一个需要两个参数的微型节点实用程序。第一个是接口名称,第二个是 javascript 文件的路径。javascript 文件必须非常简单(例如 require({root: {foo: "bar"}})):

var fs = require("fs");
var name = process.argv[2];
var file = process.argv[3];

function asInterface(o) {
  var result = "";
  for (var key in o) {
    if (!o.hasOwnProperty(key)) continue;
    var type = typeof o[key];
    if (type === "object") {
        result += key + ":{" + asInterface(o[key]) + "};\n";
    } else {
        result += key + ":" + type + ";\n";
    }
  }
  return result;
}

var target = file.substring(0, file.length - 3) + ".d.ts";

global.define = function (foo) {
  var result = "interface " + name + " {\n" + asInterface(foo.root) + "}\n";
  console.log(target, result);
  fs.writeFile(target, result);
}

var resx = require(file);
于 2013-10-29T12:02:34.533 回答