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

Javascript 如何从dojo i18n声明生成typescript接口?,javascript,dojo,typescript,Javascript,Dojo,Typescript,Dojo声明了一个i18n包,如下所示: define({root: { "fooName": "fooValue" }); 在typescript中,我可以执行以下操作: var root = { root: { "uom": { "Degrees": "Degrees" } } }; export = root; 但据我所知,tsc-d test.ts没有生成任何有用的内容: declare var root: { root: { "uom": {

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

define({root: { "fooName": "fooValue" });
在typescript中,我可以执行以下操作:

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文件?

您必须手工编写定义文件。或者只发送您的.ts文件。:)TSC不会生成.d.ts文件,到目前为止,还没有任何实用程序可以执行这种操作


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

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

首先,您可以执行以下操作:

declare function define(x);
这将在使用时消除编译器错误

define({root: { "fooName": "fooValue" }});
但是,它并没有说明define()的期望值。您可以展开声明以提供更多信息。(注意,我不熟悉dojo,所以这些只是示例)

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

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

declare function define(x: DojoI18nDefinition): void;

现在typescript知道x是什么,如果使用错误,它将给出一个错误。现在,如果您将它保存到dojo.d.ts,您将拥有一些可重用的东西。这就是现有的.d.ts文件所做的全部工作;困难在于制作出完整、准确且能处理任何角落情况的东西。

在TypeScript中描述行为的方法不止一种。
-d
生成的是良好的行为,但它更容易手工编写,并且更开放

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


问题是我有数百个资源,我希望对它们进行强类型检查。我相信我需要创建一个转换器,它以root实例作为输入并生成一个接口。您可以编写一个小实用程序,用
interface SomeNameYouWant
替换
declare var root:
,然后在应用程序中使用
interface SomeNameYouWant
引用具有此结构的数据。tsc-d生成嗯,我每天都学到新东西。有趣的是,生活有时会让你得出其他结论这不是库/编译器的问题…只是在字符串资源上寻找类型安全性。
interface DojoI18nDefinition {
    root: { [key: string]: string; };
}

declare function define(x: DojoI18nDefinition): void;
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);