尝试实现通用规范和访问者模式时,类型不满足约束并错误地扩展了接口

问题描述

我正在尝试一起实现一个通用的规范模式和一个通用的访问者模式。这是我的基本接口。

export interface Specification<T,TVisitor extends SpecificationVisitor<TVisitor,T>> {
  accept(visitor: TVisitor): void;
  isSatisfiedBy(candidate: T): boolean;
  and(other: Specification<T,TVisitor>): Specification<T,TVisitor>;
  andNot(other: Specification<T,TVisitor>;
  or(other: Specification<T,TVisitor>;
  orNot(other: Specification<T,TVisitor>;
  not(): Specification<T,TVisitor>;
}

export interface SpecificationVisitor<TVisitor extends SpecificationVisitor<TVisitor,T>,T> {
  visit(specification: AndSpecification<T,TVisitor>): void;
  visit(specification: AndNotSpecification<T,TVisitor>): void;
  visit(specification: OrSpecification<T,TVisitor>): void;
  visit(specification: OrNotSpecification<T,TVisitor>): void;
  visit(specification: NotSpecification<T,TVisitor>): void;
}

为方便起见,我为基本布尔运算符实现了一些基类和一个抽象类。

export abstract class CompositeSpecification<T,T>> implements Specification<T,TVisitor> {
  abstract isSatisfiedBy(candidate: T): boolean;
  abstract accept(visitor: TVisitor): void;

  and(other: Specification<T,TVisitor> {
    return new AndSpecification<T,TVisitor>(this,other);
  }
  andNot(other: Specification<T,TVisitor> {
    return new AndNotSpecification<T,other);
  }
  or(other: Specification<T,TVisitor> {
    return new OrSpecification<T,other);
  }
  orNot(other: Specification<T,TVisitor> {
    return new OrNotSpecification<T,other);
  }
  not(): Specification<T,TVisitor> {
    return new NotSpecification<T,TVisitor>(this);
  }
}

export class AndSpecification<T,T>> extends CompositeSpecification<
  T,TVisitor
> {
  constructor(readonly left: Specification<T,TVisitor>,readonly right: Specification<T,TVisitor>) {
    super();
  }

  accept(visitor: TVisitor): void {
    visitor.visit(this);
  }

  isSatisfiedBy(candidate: T): boolean {
    return this.left.isSatisfiedBy(candidate) && this.right.isSatisfiedBy(candidate);
  }
}

export class AndNotSpecification<T,T>> extends CompositeSpecification<T,TVisitor> {
  constructor(readonly left: Specification<T,TVisitor>) {
    super();
  }

  accept(visitor: TVisitor): void {
    visitor.visit(this);
  }

  isSatisfiedBy(candidate: T): boolean {
    return this.left.isSatisfiedBy(candidate) && !this.right.isSatisfiedBy(candidate);
  }
}

export class OrSpecification<T,TVisitor>) {
    super();
  }

  accept(visitor: TVisitor): void {
    visitor.visit(this);
  }

  isSatisfiedBy(candidate: T): boolean {
    return this.left.isSatisfiedBy(candidate) || this.right.isSatisfiedBy(candidate);
  }
}

export class OrNotSpecification<T,TVisitor>) {
    super();
  }

  accept(visitor: TVisitor): void {
    visitor.visit(this);
  }

  isSatisfiedBy(candidate: T): boolean {
    return this.left.isSatisfiedBy(candidate) || !this.right.isSatisfiedBy(candidate);
  }
}

export class NotSpecification<T,TVisitor
> {
  constructor(readonly other: Specification<T,TVisitor>) {
    super();
  }

  accept(visitor: TVisitor): void {
    visitor.visit(this);
  }

  isSatisfiedBy(candidate: T): boolean {
    return !this.other.isSatisfiedBy(candidate);
  }
}

以上所有的工作和编译没有错误。但是,当我尝试创建一个扩展基本 SpecificationVisitor 接口的接口并实现一个扩展抽象 CompositeSpecification 的类时遇到编译器问题。

export interface NumberComparatorVisitor extends SpecificationVisitor<NumberComparatorVisitor,number> {
  visit(specification: GreaterThan): void;
}

export class GreaterThan extends CompositeSpecification<number,NumberComparatorVisitor> {
  constructor(readonly value: number) {
    super();
  }

  accept(visitor: NumberComparatorVisitor): void {
    visitor.visit(this);
  }

  isSatisfiedBy(candidate: number): boolean {
    return candidate > this.value;
  }
}

我收到以下错误:

Type 'NumberComparatorVisitor' does not satisfy the constraint 'SpecificationVisitor<NumberComparatorVisitor,number>'.ts(2344)

Interface 'NumberComparatorVisitor' incorrectly extends interface 'SpecificationVisitor<NumberComparatorVisitor,number>'.
  Types of property 'visit' are incompatible.
    Type '(specification: GreaterThan) => void' is not assignable to type '{ (specification: AndSpecification<number,NumberComparatorVisitor>): void; (specification: AndNotSpecification<number,NumberComparatorVisitor>): void; (specification: OrSpecification<...>): void; (specification: OrNotSpecification<...>): void; (specification: NotSpecification<...>): void; }'.
      Types of parameters 'specification' and 'specification' are incompatible.
        Type 'AndSpecification<number,NumberComparatorVisitor>' is not assignable to type 'GreaterThan'.ts(2430)

Type 'NumberComparatorVisitor' does not satisfy the constraint 'SpecificationVisitor<NumberComparatorVisitor,NumberComparatorVisitor>): void; (specification: OrSpecification<...>): void; (specification: OrNotSpecification<...>): void; (specification: NotSpecification<...>): void; }'.
      Types of parameters 'specification' and 'specification' are incompatible.
        Property 'value' is missing in type 'AndSpecification<number,NumberComparatorVisitor>' but required in type 'GreaterThan'.ts(2344)

我不太明白为什么它会抱怨。我需要改变什么才能让它按照我想要的方式工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)