看看这一类型:

type MyType =
  | { a: number }
  | { b: number }
  | { c: number }
  | ({ b: number } & { c: number });

我想禁止a和b或c的组合.

  const o1: MyType = { a: 10 };             // only a: OK
  const o2: MyType = { b: 10 };             // only b: OK
  const o3: MyType = { c: 10 };             // only c: OK
  const o4: MyType = { b: 10, c: 10 };     // combine b and c: OK

  // const o5: MyType = {};                     // Forbidden (no fields)
  const o6: MyType = { a: 10, b: 10 };        // Forbidden (I should not be able to combine a and b)

我不明白,因为typescript允许我实例化o6.不应该因为我不想看到a和b在一起...

有什么 idea 吗?

谢谢

推荐答案

看起来不太好,但XOR会帮助你在这种情况下.

type MyType =
  | { a: number, b?: never }
  | { b: number, a?: never }
  | { c: number }
  | ({ b: number } & { c: number });

更好的理解是认为联盟是任何类型的联盟.不是,或者基本上.

Typescript相关问答推荐

如何在类型脚本中声明对象其键名称不同但类型相同?

如何正确修复TypScript 4.7到4.8升级中的TS 2345编译错误

为什么typescript要把这个空合并转换成三元?

当使用`type B = A`时,B的类型显示为A.为什么当`type B = A时显示为`any `|用A代替?

我们过go 不能从TypeScript中的联合中同时访问所有属性?

扩展函数签名中的参数类型,而不使用泛型

异步动态生成Playwright测试,显示未找到测试

我可以为情态车使用棱角形的路由守卫吗?

Angular 15使用react 式表单在数组内部创建动态表单数组

为什么我的动画状态在组件实例之间共享?

不带其他属性的精确函数返回类型

如何缩小函数的返回类型?

我不明白使用打字脚本在模板中展开参考

打字错误TS2305:模块常量没有导出的成员

具有匹配功能的TS通用事件处理程序

如何静态键入返回数组1到n的函数

Rxjs将省略的可观测对象合并到一个数组中

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

仅当类型为联合类型时映射属性类型

我的类型谓词函数不能像我预期的那样工作.需要帮助了解原因