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文件?
答案 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);