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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:05:24