Angular 在Typescript中键入委托
我有以下场景(代码片段,为了简洁起见省略了一些代码):Angular 在Typescript中键入委托,angular,typescript,inheritance,karma-runner,Angular,Typescript,Inheritance,Karma Runner,我有以下场景(代码片段,为了简洁起见省略了一些代码): 导出类ValidationBuilderBase实现了IValidationBuilder{ public isRequired():IValidationBuilder{ const validationResult=Validators.required(this.baseControl); 如果(!isNullOrUndefined(validationResult)和&!isNullOrUndefined(validationRes
导出类ValidationBuilderBase实现了IValidationBuilder{
public isRequired():IValidationBuilder{
const validationResult=Validators.required(this.baseControl);
如果(!isNullOrUndefined(validationResult)和&!isNullOrUndefined(validationResult.required))){
this.baseErrors['required']='此输入是必需的。;//ValdationErrors实例
}
归还这个;
}
}
导出接口生成器{
isRequired():IValidationBuilder;
}
导出类StringValidationBuilder实现IValidationBuilder{
构造函数(专用只读生成器:Validationbuilderbase){}
isRequired():StringValidationBuilder{
将此.builder.isRequired()作为StringValidationBuilder返回;
}
}
//其他代码,这在函数中
让builder=newvalidationbuilder(this.formGroup.controls['test']);
let validator:StringValidationBuilder=新的StringValidationBuilder(生成器);
const result=validator.isRequired();//这种类型应该是什么?StringValidationBuilder还是IValidationBuilder?
在这里,我使用构建器模式执行一些代码,并返回自身的实例。但是,在开发人员工具中运行代码(通过karma jasmine测试)时,validator.isRequired()
在类型IValidationBuilder
中解析
我希望它会导致StringValidationBuilder
,因为StringValidationBuilder
正在实现接口,但会用StringValidationBuilder
覆盖返回类型,这应该是有效的吗
我很困惑。在IDE(VsCode)中,代码完成说明返回类型应为StringValidationBuilder
编辑
我正在努力实现以下目标:
description(`String validation chaining`,()=>{
它(`应该不会从(有效)链中返回任何错误',()=>{
control().setValidators(Validators.required);
control().setValue('这是一些测试字符串……);
常量结果=验证程序
一串
.ifTrue((val)=>false,“错误”,“不应到达此处”)
.ifFalse((val)=>true,‘错误’、‘不应到达此处’)
.isRequired()
Maxlengthalowed先生(100)
.Minlengthalowed(0)
.范围(25,35)
.build();
expect(result).toEqual(null);
});
});
我把代码修改为
导出类StringValidationBuilder实现IValidationBuilder{
isRequired():StringValidationBuilder{
this.builder.isRequired();
归还这个;
}
}
我仍然不相信这是理想的解决方案。它怎么可能是
StringValidationBuilder
,您返回的是ValidationBuilderBase
,因为这就是builder。StringValidationBuilder没有扩展它
我相信您正在尝试的是使StringValidationBuilder
扩展validationbuilder数据库。只需使用super
通话,您的生活就会轻松得多:
export class ValidationBuilderBase implements IValidationBuilder {
constructor(private controls: any) {}
public isRequired(): ValidationBuilderBase {
return this;
}
}
export interface IValidationBuilder {
isRequired(): IValidationBuilder;
}
export class StringValidationBuilder extends ValidationBuilderBase {
constructor(controls: any) {
super(controls);
}
isRequired(): StringValidationBuilder {
return super.isRequired();
}
}
const validator = new StringValidationBuilder(this.formGroup.controls['test']);
const result = validator.isRequired();
// result is now a StringValidationBuilder
尝试将isRequired():IValidationBuilder
更改为isRequired():this
。不要更改派生类中的返回类型。继续使用:此。老实说,我不记得这是一种类型脚本,还是我把它与另一种语言混淆了。我认为OP的目的是创建一个具有流畅接口的api。因此,他希望像这样链接验证规则:validator.isRequired().maxLength(6.pattern('Regex')代码>@Eldar没错,我想是这样的。代码的简洁性并不能说明这一点。但是对于这一点,他仍然不需要在构造函数中传递单独的构建器,对吗?我确实看到了问题,@PierreDuc you是对的。我正试图创建一个如艾达所说的fluentApi,但我没有返回正确的类型。我也认为你是对的,我也应该扩展基础,但同时我做了编辑部分,这导致我做了我需要做的事情。有一些原因我不能扩展基础,我在这里不深入讨论。这就是为什么我必须用一个基本构建器创建一个构建器的实例,它被传递并且不会丢失引用。我像constvalidator=newvalidationbuilder(formControl).string.range(lowerRange,upperRange)那样使用它代码>,其中.string
是要使用的正确生成器(StringValidationBuilder
)。我们还有很多其他的验证器,“string”在这里是最容易使用的。分解以使构建者负责自己的验证。