Typescript - 翻译字符串打字解决方案?
Typescript - translation strings typings solution?
我正在使用此对象格式来存储多种语言的翻译字符串:
export const Translations = {
'en': {
text1: 'Hello world!',
text2: 'Login'
}
'cs': {
text1: 'Ahoj svět!',
text2: 'Přihlášení'
}
}
然后我有我的状态和定义状态的接口:
export const MyState: State = {
lang: 'cs',
trans: Translations.cs,
}
export type State = {
lang: LangCodes,
trans: ???
}
现在我需要以某种方式定义 MyState.trans
只能包含翻译属性的名称,在这种情况下意味着 text1, text2
。在编辑器中为此对象启用类型检查和自动完成功能的东西(当这样使用时:MyState.trans.text1
)。可以吗?
我相信所有 possible/allowed 州的联盟应该有所帮助:
export const Translations = {
'en': {
text1: 'Hello world!',
text2: 'Login'
},
'cs': {
text1: 'Ahoj svět!',
text2: 'Přihlášení'
}
} as const
type Translations = typeof Translations
type LangCodes = keyof Translations
type Values<T> = T[keyof T]
// Make union of all allowed states
type Union = {
[P in LangCodes]: {
lang: P,
trans: Translations[P]
}
}
// get all values of the union
type State = Values<Union>
export const MyState: State = {
lang: 'cs',
trans:Translations.cs
} // ok
export const MyWrongState: State = {
lang: 'cs',
trans:Translations.en
} // error
P.S。我的主要目标是使无效状态无法表示
我正在使用此对象格式来存储多种语言的翻译字符串:
export const Translations = {
'en': {
text1: 'Hello world!',
text2: 'Login'
}
'cs': {
text1: 'Ahoj svět!',
text2: 'Přihlášení'
}
}
然后我有我的状态和定义状态的接口:
export const MyState: State = {
lang: 'cs',
trans: Translations.cs,
}
export type State = {
lang: LangCodes,
trans: ???
}
现在我需要以某种方式定义 MyState.trans
只能包含翻译属性的名称,在这种情况下意味着 text1, text2
。在编辑器中为此对象启用类型检查和自动完成功能的东西(当这样使用时:MyState.trans.text1
)。可以吗?
我相信所有 possible/allowed 州的联盟应该有所帮助:
export const Translations = {
'en': {
text1: 'Hello world!',
text2: 'Login'
},
'cs': {
text1: 'Ahoj svět!',
text2: 'Přihlášení'
}
} as const
type Translations = typeof Translations
type LangCodes = keyof Translations
type Values<T> = T[keyof T]
// Make union of all allowed states
type Union = {
[P in LangCodes]: {
lang: P,
trans: Translations[P]
}
}
// get all values of the union
type State = Values<Union>
export const MyState: State = {
lang: 'cs',
trans:Translations.cs
} // ok
export const MyWrongState: State = {
lang: 'cs',
trans:Translations.en
} // error
P.S。我的主要目标是使无效状态无法表示