打字稿:记录KeyType -> 值类型

Typescript: record of KeyType -> value types

我需要创建一个 Typescript Record,其中的键定义在一个独立的类型中,每个值都有特定的类型。

按键定义如下:

// Keys must be available/iterable at runtime
const keys = ['a', 'b', 'c'] as const
export type Key = typeof keys[number]

现在我看到两个选项,都有缺陷。

选项 1:根据需要重复键并明确定义值类型。缺陷:Structure 实际上并非基于 Key,它们可能会有所偏差。

export type Structure1 = {
  a: number
  b: boolean
  c: string
}

选项 2:定义来自 Key 的记录并丢失值的特定类型信息:

export type Structure2 = Record<Key, number | boolean | string>

Structure3 是否有第三个选项使用 Key 作为键类型 每个键的显式值类型?

你可以让它保持干燥并像这样强制执行你的接口键(性能奖励:没有额外的运行时代码):

TS Playground link

type EnforceKeys<Key extends string, T extends Record<Key, unknown>> = {
  [K in keyof T as K extends Key ? K : never]: T[K];
};

const keys = ['a', 'b', 'c'] as const;
type Key = typeof keys[number];

// Ok
type Structure1 = EnforceKeys<Key, {
  a: number;
  b: boolean;
  c: string;
}>;

// Ok, and extra properties are omitted
type Structure2 = EnforceKeys<Key, {
  a: number;
  b: boolean;
  c: string;
  d: number[]; // omitted from type
  e: boolean; // omitted from type
}>;

// Error: Property 'c' is missing in type... (2344)
type Structure3 = EnforceKeys<Key, {
  a: number;
  b: boolean;
}>;