我目前正在开发一个应该支持多种语言的网站。本网站的开发归功于Angular JS 1.4,我目前正致力于将其升级到Angular JS 2.0。
在1.x版本中,我有一个全局文字对象,如下所示:
var language = {};
然后,我有几个文件正在做这样的事情:
language.foo = {
key_1: "value_1",
key_2: "value_2",
...
key_n: "value_n"
}
如果我这样离开,我可以在我的“ts”文件中使用它:
var lang: string = language.foo.key_n;
它仍适用于AngularJS 2,但它不是非常TypeScripty(此外,PHPStorm将其标记为未知)。那么TypeScript中这个全局文字对象的替代方法是什么?
答案 0 :(得分:1)
一种方法是在描述languages
的内容的接口中使用索引签名:
// The top level object contains ILanguage objects, indexed by the name of the language.
interface ILanguages {
[index: string]: ILanguage;
}
// An individual language contains strings, indexed by key name.
interface ILanguage {
[index: string]: string;
}
// In the file where the language object is created:
var language: ILanguages = {};
// In the file where the foo language is defined:
language['foo'] = {
key_1: "value_1",
key_2: "value_2",
...
key_n: "value_n"
}
// Everywhere else that it's just referenced:
declare var language: ILanguages;
var lang: string = language['foo']['key_1'];
这为languages
提供了一些结构和编译时检查,而无需明确定义其字段。
答案 1 :(得分:-1)
在OOP中,您可以使用singleton来解决此类问题。这只是一个选择。 Dependency injection是另一个很好的解决方案。