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”在这里是最容易使用的。分解以使构建者负责自己的验证。