如何在TypeScript中创建包含必选枚举成员的数组类型?
在TypeScript中定义必须包含指定枚举成员的数组类型
你需要的是一个数组类型,要求元素为Color枚举值,且必须同时包含black和white两个成员。直接继承Array的方式只能约束元素类型,无法强制要求特定成员存在,因此需要换一种实现思路:
方法1:利用includes方法的类型约束
通过交叉类型,让数组同时满足Color[]类型,并且强制调用includes(Color.black)和includes(Color.white)时必然返回true,以此确保数组包含这两个成员:
enum Color { red, green, yellow, blue, black, white, } type AnyColorsWithBlackAndWhite = Color[] & { includes(searchElement: Color.black): true; includes(searchElement: Color.white): true; }; // 正确:同时包含black和white export const Correct: AnyColorsWithBlackAndWhite = [Color.red, Color.yellow, Color.black, Color.white]; // 错误:缺少black和white(会触发类型检查报错) // export const Wrong1: AnyColorsWithBlackAndWhite = [Color.red, Color.yellow]; // 错误:缺少white(会触发类型检查报错) // export const Wrong2: AnyColorsWithBlackAndWhite = [Color.red, Color.yellow, Color.black];
原理:TypeScript会根据数组的实际元素推断includes方法的返回类型——如果数组确定包含某个元素,includes该元素的返回值会被窄化为true,否则为boolean。通过交叉类型强制这两个includes调用必须返回true,就确保了数组必然包含对应的成员。
方法2:结合元组与剩余元素(覆盖位置组合)
如果你想更明确地约束成员存在,可以用元组组合剩余元素,覆盖black和white的所有位置组合,同时允许任意数量的其他Color成员:
type AnyColorsWithBlackAndWhite = [Color.black, Color.white, ...Color[]] | [Color.white, Color.black, ...Color[]] | [Color.black, ...Color[], Color.white] | [Color.white, ...Color[], Color.black] | [...Color[], Color.black, Color.white] | [...Color[], Color.white, Color.black]; // 正确示例 export const Correct1: AnyColorsWithBlackAndWhite = [Color.black, Color.white]; export const Correct2: AnyColorsWithBlackAndWhite = [Color.red, Color.black, Color.yellow, Color.white]; export const Correct3: AnyColorsWithBlackAndWhite = [Color.white, Color.blue, Color.black]; // 错误示例(缺少white,触发类型检查报错) // export const Wrong: AnyColorsWithBlackAndWhite = [Color.red, Color.black];
该方法的缺点是扩展性较差,如果后续需要强制包含更多枚举成员,需要列举的位置组合会指数级增加,因此更推荐第一种方法。
内容的提问来源于stack exchange,提问作者godblessstrawberry
相关产品推荐
相关产品推荐

