场景如下:

type Option = 'a' | 'b' | 'c' | 'd'

type Question = {
  message: string;
  options: Option[];
  default: Option // here's the issue
}

我希望defaultprops 是question.options内使用的选项之一.例如:

const q1: Question = {
  message: 'first question',
  options: ['a', 'b'],
  default: 'a'
}

const q2: Question = {
  message: 'second question',
  options: ['c', 'd'],
  default: 'a' // I want this to give an error because 'a' is not in 'c' | 'd'
}

我怎样才能做到这一点呢?

推荐答案

只需使用Question就可以完成;然而,这将是一个复杂的类型,会给编译器带来可怕的时间,因为它以2的幂的速度增长,如果您有更多的选项(超过10个),编译器将达到其限制并且不能编译.

相反,我建议调整Question以接受Option[]作为泛型参数,并将该泛型参数的元素类型分配给default:

type Question<T extends Option[]> = {
  message: string;
  options: T;
  default: T[number];
};

最后,我们需要一个泛型函数来为我们创建一个问题:

const createQuestion = <T extends Option[]>(question: Question<T>) => question;

用途:

const q1 = createQuestion({
  message: "first question",
  options: ["a", "b"],
  default: "a",
});

const q2 = createQuestion({
  message: "second question",
  options: ["c", "d"],
  default: "a", // Expected error
});

playground

Typescript相关问答推荐

等待的R没有用响应对象展开到R

ReturnType此索引方法与点表示法之间的差异

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

键集分页顺序/时间戳上的筛选器,精度不相同

Angular 信号:当输入信号改变值时,S触发取数的正确方式是什么?

对扩展某种类型的属性子集进行操作的函数

如何按不能保证的功能过滤按键?

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

如何将泛型对象作为返回类型添加到类型脚本中

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

为什么我的查询钩子返回的结果与浏览器的网络选项卡中看到的结果不同?

APP_INITIALIZER在继续到其他Provider 之前未解析promise

找不到财产的标准方式?

ANGLE NumberValueAccessor表单控件值更改订阅两次

抽象类对派生类强制不同的构造函数签名

打印脚本中正则函数和函数表达式的不同类型缩小行为

递归生成常量树形 struct 的键控类型

在REACT查询中获取未定义的isLoading态

Vite+Chrome扩展 list v3-;不能在模块外使用import语句;对于inpage脚本

递归地排除/省略两种类型之间的公共属性