带有映射类型和常量断言的TypeScript生成器模式

带有映射类型和常量断言的TypeScript生成器模式,typescript,builder,typescript-generics,typescript3.0,Typescript,Builder,Typescript Generics,Typescript3.0,在TypeScript中,我可以创建一个函数buildOptions(options,default),其中options是任何内容的数组,default是必须来自选项数组的值。我相信这是可以做到的,因为和 const buildOptions=( 选项:只读, 默认选项:K ) => ({ 选项, 默认值:options.findIndex(x=>x==defaultOption), }); //工作 构建选项(['a','b']作为常量,'a'); //编译错误:“4”类型的参数不能分配给“

在TypeScript中,我可以创建一个函数
buildOptions(options,default)
,其中
options
是任何内容的数组,
default
是必须来自选项数组的值。我相信这是可以做到的,因为和

const buildOptions=(
选项:只读,
默认选项:K
) => ({
选项,
默认值:options.findIndex(x=>x==defaultOption),
});
//工作
构建选项(['a','b']作为常量,'a');
//编译错误:“4”类型的参数不能分配给“2 | 1 | 3”类型的参数。
构建选项([1,2,3]作为常量,4);
是否可以使用生成器模式添加此级别的键入?我希望有一个与以下类似的界面:

optionBuilder()
.addOption(1)
.addOption(2)
.addOption(3)
.setDefault(4)//编译错误
.build();
或者可能:

optionBuilder()
.addOptions([1,2,3]作为常量)
.setDefault(4)//编译错误
.build();
如果不能在TypeScript中完成,有人知道可以用什么语言完成吗

谢谢大家!

是的,我们可以:)


类生成器{
添加选项(v:v):生成器{
//做你的事
将此作为生成器返回;
}
setDefault(v:T):此{
//做你的事
归还这个;
}
build():T[]{
//返回所有选项的列表??
}
}
函数选项生成器():生成器{
返回新的生成器();
}
optionBuilder()
.addOption(1作为常量)
.addOption('str'作为常量)
.setDefault(1)//确定
.setDefault(12)//编译错误
.setDefault('str')//确定
.setDefault('strstrstr')//编译错误
.build();
注意

  • 所有
    as const
    都是必需的,否则
    1
    被视为
    number
    (例如)
  • optionBuilder
    的返回类型必须使用
    never
    类型,以确保我们的构建器一开始就没有类型,否则它将使用
    unknown
    并接受所有内容

也许有更好的解决办法,我希望

这真漂亮。非常感谢你。您是否知道是否有人建议将参数定义为const断言,因此知道这样做并不是界面用户的责任?我知道这将要求函数只处理文本,但我同意这一点。@AndrewFerk我刚才提交的,这与您想要的类似。如果你看一下,它还显示了如何让编译器使用一些非直观的语法(又称邪恶巫术)推断出更窄的类型。我刚刚注意到,在添加所有选项后,我必须使用
setDefault
。举我的例子,这很好,但我试图不强制执行层次结构。这几乎就像我希望在调用
build
函数之前不进行类型检查一样。同时,当选项已知时,我希望使用intellisense。是否允许在
addOption
函数调用之前或之后调用
setDefault