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

Playground

P.S。我的主要目标是使无效状态无法表示