我有以下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
我已经明确定义了所有三个属性。我在做什么错了?
答案 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"
};