Typescript-即使定义了所有选项,Type仍缺少type的以下属性

时间:2019-03-18 09:34:04

标签: typescript

我有以下Typescript定义:

type TDisplayKey = "a" | "b" | "c";

const DISPLAY_KEYS: Record<string, TDisplayKey> = {
  A: "a",
  B: "b",
  C: "c"
};

const DISPLAY_KEY_TITLES: Record<TDisplayKey, string> = {
  [DISPLAY_KEYS.A]: "Ay",
  [DISPLAY_KEYS.B]: "Bi",
  [DISPLAY_KEYS.C]: "Ci"
};

我在DISPLAY_KEY_TITLES上收到以下错误(在VSCode中):

Type '{ [x: string]: string; }' is missing the following properties from type 'Record<TDisplayKey, string>': a, b, c

我已经明确定义了所有三个属性。我在做什么错了?

1 个答案:

答案 0 :(得分:2)

问题出在DISPLAY_KEYS上。 DISPLAY_KEYS的属性键入为"a" | "b" | "c"。由于此打字稿不会尝试对您可以定义的计算属性做更严格的规定。

您想使DISPLAY_KEYS更具体。您可以将类型手动定义为:

const DISPLAY_KEYS: {
    A: "a";
    B: "b";
    C: "c";
} = {
  A: "a",
  B: "b",
  C: "c"
}

不幸的是,这是很多重复。另一个选择是使用DISPLAY_KEYS = { /*...*/ } as const(很快将在3.4中可用),或者您可以使用辅助函数来帮助打字稿推断上述类型:

type TDisplayKey = "a" | "b" | "c";

const DISPLAY_KEYS = (<T extends Record<string, TDisplayKey>>(o:T)=>o)({
    A: "a",
    B: "b",
    C: "c"
});

const DISPLAY_KEY_TITLES: Record<TDisplayKey, string> = {
    [DISPLAY_KEYS.A]: "Ay",
    [DISPLAY_KEYS.B]: "Bi",
    [DISPLAY_KEYS.C]: "Ci"
};