2015-12-19 3 views
0

В настоящее время я работаю над сайтом, который должен поддерживать несколько языков. Этот сайт разработан благодаря Angular JS 1.4, и в настоящее время я работаю над его обновлением до Angular JS 2.0.Эквивалент литерального объекта в TypeScript

В версии 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; 

Он по-прежнему работает с Ang ularJS 2, но это не очень TypeScripty (кроме того, PHPStorm отмечает это как неизвестное). Итак, какова альтернатива этому глобальному литералному объекту в TypeScript?

ответ

-1

В ООП вы можете использовать singleton, чтобы решить что-то вроде этого. Это всего лишь один вариант. Dependency injection - еще одно хорошее решение.

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 без определения его поля явно.

+0

Спасибо, я посмотрю, подходит ли оно мне. – ssougnez

Смежные вопросы