首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录中的交集类型的意外行为

类型记录中的交集类型的意外行为
EN

Stack Overflow用户
提问于 2022-10-07 13:46:14
回答 1查看 45关注 0票数 2

我试着用我能找到的最简单的测试案例来解决现实世界的问题。我正在尝试构建一些有用的类型对象,但是我被一个我并不真正理解的错误所阻碍。在下面,palette3和palette4类型检查,但我必须比我想要的更加明确,我希望palette2类型检查。有什么简单的调整可以使palette2工作吗?

代码语言:javascript
复制
enum Color {
  Red,
  White,
  Blue,
  Green,
  Black,
}

interface Attr {
  foo: unknown;
  bar: unknown;
  baz: unknown;
};

type WhichColors = Attr & Record<string, Color >;
const palette1 : WhichColors = { foo: Color.Blue, bar: Color.Green, baz: Color.Black };

type Monochrome = WhichColors & Record<string, Color.White | Color.Black>;

// Doesn't type-check
const palette2: Monochrome = {
  foo: Color.Black,
  bar: Color.White,
  baz: Color.Black
};

// Typechecks but clunky
const palette3: Monochrome = {
  foo: Color.Black as Color.White | Color.Black,
  bar: Color.White as Color.White | Color.Black,
  baz: Color.Black as Color.White | Color.Black,
};

// Also typechecks but also clunky
const palette4 = {
  foo: Color.Black,
  bar: Color.White,
  baz: Color.Black,
} as Monochrome;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-07 13:51:12

您应该使用keyof Attr而不是string来消除对交集的需求:

代码语言:javascript
复制
type WhichColors = Record<keyof Attr, Color>;

操场(将Attr改为属性,因为它与DOM API中的Attr冲突)

您的原始解决方案没有工作,因为该交叉口实际上解决了以下问题:

代码语言:javascript
复制
type WhichColors = {
    [x: string]: Color;
    foo: unknown;
    bar: unknown;
    baz: unknown;
};

如果您使用这个“技巧”来简化类型,您可以看到:

代码语言:javascript
复制
type WhichColors = (Attributes & Record<string, Color>) extends infer O ? ({ [K in keyof O]: O[K] }) : never;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73988140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档