2013-10-28 33 views
2

道场宣布的国际化包装,像这样:如何从dojo i18n声明中生成typescript接口?

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

我最后写一个小节点工具,它需要两个参数。第一个是接口名称,第二个是JavaScript文件的路径。 JavaScript文件必须是非常简单的(例如要求({根:{FOO: “酒吧”}})):

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); 
0

您必须手工编写定义文件。或者只是运送你的.ts文件。 :) TSC不会生成.d.ts文件,到目前为止,还没有实用工具可以完成这样的事情。

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

+0

TSC -d产生.d.ts文件 –

+0

嗯,我每天学习新的东西。有趣的是,生活有时可以让你指出其他的结论。 :) –

0

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

要开始,你可以这样做:

declare function define(x); 

这将摆脱当你使用

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

这不,但是,多讲什么定义(编译错误)期待。您可以扩展该声明以提供更多信息。 (请注意,我不熟悉的道场,所以这些只是一些例子)

// 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文件所做的一切;困难在于制作完整,准确的东西,并处理任何角落案例。

+0

这不是一个库/编译器问题......只是寻找字符串资源的类型安全。 –

0

在TypeScript中有多种描述行为的方法。什么-d产生是好的行为,明智的,但它很容易直接手工编写,并做出更开放

+0

事情是我有数百个资源,我想对它们进行强类型检查。我相信我需要创建一个转换器,它将一个根实例作为输入并生成一个接口。 –

+1

你可以编写一个小实用程序,用'interface SomeNameYouWant'替换'declare var root:',然后在你的应用程序中使用'interface SomeNameYouWant'来引用具有这种结构的数据。 – basarat