Javascript 如何从dojo i18n声明生成typescript接口?
Dojo声明了一个i18n包,如下所示: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": {
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);