2013-10-28 38 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