打字稿使用基于联合类型的键创建类型

时间:2021-04-13 00:46:25

标签: typescript typescript-typings

我有一个翻译对象,它可以拥有与字符串可能被翻译成的所有语言相对应的键,以及作为翻译字符串的值,如下所示:

const trans = {
  en: "Hello, how is it going?",
  de: "Hallo, wie gehts?",
  da: "Hej, hvordan går det?"
}

我目前正在像这样输入对象:

type TransType = {
  [key: string]: string;
}

但我也有其他地方使用的联合类型来控制可以实现哪些语言:

type Languages = "en" | "de" | "da";

如何将这两者结合起来,并根据 Languages 联合类型控制可以在 trans 对象中使用哪些键?

1 个答案:

答案 0 :(得分:1)

您可以为此使用映射类型 (docs):

type Languages = "en" | "de" | "da"

type TransType = {
  [key in Languages]: string
}
// infers TransType = { en: string, de: string, da: string }

const trans: TransType = {
  en: "Hello, how is it going?",
  de: "Hallo, wie gehts?",
  da: "Hej, hvordan går det?",
  nl: "Onbekende taal" // Error, as 'nl' is not in Languages
}

或者,正如 rshepp 提到的,您可以使用 Record 实用程序类型 (docs, src),它将定义相同的映射类型:

type TransType = Record<Languages, string>

TypeScript playground