打字稿:记录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
作为键类型 和 每个键的显式值类型?
你可以让它保持干燥并像这样强制执行你的接口键(性能奖励:没有额外的运行时代码):
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;
}>;
我需要创建一个 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
作为键类型 和 每个键的显式值类型?
你可以让它保持干燥并像这样强制执行你的接口键(性能奖励:没有额外的运行时代码):
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;
}>;