如何从dojo i18n声明生成typescript接口?

时间:2013-10-28 18:58:24

标签: javascript dojo typescript

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 个答案:

答案 0 :(得分:0)

您必须手动编写定义文件。或者只是发送你的.ts文件。 :) TSC不会生成.d.ts文件,到目前为止还没有实用程序会做这样的事情。

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

答案 1 :(得分:0)

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

首先,您可以这样做:

declare function define(x);

当你使用

时,这将消除编译器错误
define({root: { "fooName": "fooValue" }});

然而,它并没有说明define()所期望的内容。您可以展开声明以提供更多信息。 (注意,我不熟悉dojo,所以这些只是示例)

// 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;

现在打字稿知道x是什么,如果使用错误会给出错误。现在如果你把它保存到dojo.d.ts,你就会有一些可重用的东西。这就是现有的.d.ts文件所做的全部工作;难以做出完整,准确,处理任何角落案件的事情。

答案 2 :(得分:0)

在TypeScript中描述行为的方法不止一种。 -d生成的内容是明智的行为,但更容易手工编写并使其更加 open

答案 3 :(得分: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);