You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将接口属性的变体转换为必填的精确对象键?

解决方法

你现在用Pick<ITest, 'colorVariant'>完全搞错了方向——这个工具类型的作用是从接口里选取指定属性,得到的类型是{ colorVariant: 'default' | 'primary' | 'secondary' },和你想要的「以枚举值为键的对象」根本不是一回事。

要实现必须包含所有变体作为键、不能缺也不能多的对象类型,直接用TypeScript内置的Record工具类型就能搞定:

步骤1:提取接口属性的联合类型

先把ITest里colorVariant的所有枚举值提取成单独的类型(单独提取是为了可读性,也可以直接跳过这步):

interface ITest {
    colorVariant: 'default' | 'primary' | 'secondary'
}

// 提取colorVariant的所有可能值为联合类型
type ColorVariant = ITest['colorVariant'];

步骤2:定义约束对象的类型

用Record创建一个强制要求所有枚举值都作为键的对象类型:

// 第二个参数是值的类型,可根据你的需求替换(比如string/number等)
type ColorVariantMap = Record<ColorVariant, string>;

验证效果

现在用这个类型约束对象,就能完全匹配你的要求:

// ✅ 正确:包含所有键,无额外键
const colorVariantList: ColorVariantMap = {
    default: 'test',
    primary: 'test2',
    secondary: 'test3',
};

// ❌ 错误:缺少secondary键,TypeScript会提示「属性'secondary'缺失」
const colorVariantList2: ColorVariantMap = {
    default: 'test',
    primary: 'test2',
};

// ❌ 错误:存在额外的potato键,TypeScript会提示「对象文字可以只指定已知属性,'potato'不在类型ColorVariantMap中」
const colorVariantList3: ColorVariantMap = {
    default: 'test',
    primary: 'test2',
    potato: 'test3',
};

简化写法

如果不需要单独的ColorVariant类型,也可以直接合并成一行:

type ColorVariantMap = Record<ITest['colorVariant'], string>;

Record<K, T>的核心作用就是强制对象包含联合类型K的所有成员作为键,同时不允许添加K之外的键,完美贴合你的需求。

内容的提问来源于stack exchange,提问作者Bruno Henrique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:31:17