首页 > 解决方案 > 确保字符串文字联合属于对象的键

问题描述

export type A = "a" | "b" | "c";

const obj = { a: 4, b: 5, c: 6, d: 7 };

如何确保所有元素A都是 object 的键obj

标签: typescript

解决方案


根据您的需要,您可以自动构造您的类型:

作为一个类型的所有键

您可以使用keyof将所有键作为一个联合。由于keyof需要在类型上使用,因此keyof typeof obj

const obj = { a: 4, b: 5, c: 6, d: 7 };

export type A = keyof typeof obj; // "a" | "b" | "c" | "d"

游乐场链接

删除一些键

然后,您可以Exclude获取一些密钥并获得其余的:

const obj = { a: 4, b: 5, c: 6, d: 7 };
type AllKeys = keyof typeof obj;
export type A = Exclude<AllKeys, "d">; // "a" | "b" | "c" 

游乐场链接

AllKeys类型只是为了方便,您可以内联它并使用Exclude<keyof typeof obj, "d">

只允许某些键

这将与Exclude- 而不是将键列入黑名单相反,您有一个白名单,并且仅使用交叉点选择其中存在的键:

const obj = { a: 4, b: 5, c: 6, d: 7 };
type AllKeys = keyof typeof obj;
type AllowedKeys = "a" | "b" | "c" | "y" | "z";
export type A = AllKeys & AllowedKeys; // "a" | "b" | "c"

游乐场链接

AllKeys同样,这两种类型AllowedKeys是为了方便起见。你也可以拥有相同的keyof typeof obj & ("a" | "b" | "c" | "y" | "z");


推荐阅读