Búsqueda de sitios web

La propiedad no existe en la implementación de interfaz auto-referenciada en Typescript


Todavía soy nuevo en Typescript, ¿alguien puede explicarme dónde me equivoqué aquí? ¿Es un comportamiento esperado o un error?

// interfaces/ValueObject.ts

export interface ValueObject {
  equals<T extends ValueObject> (valueObject: T): boolean;
  toString (): string;
}
// values/Age.ts

export class Age implements ValueObject {
  constructor (
    public readonly value: number,
  ) {}

  equals<Age> (anotherAge: Age): boolean {
    return anotherAge.value === this.value;
  }

  toString () {
    return `${this.value} year{this.value === 1 ? '' : 's'} old`;
  }
}

De alguna manera obtuve el siguiente error al compilar: Property 'value' does not exist on type 'Age'. Pero declaré la propiedad value en el constructor, ¿hice algo mal?

Respuesta #1

Cuando escribes equals<Age> (anotherAge: Age): boolean, el <Age> introduce un nuevo parámetro de tipo Age. Esto significa que el Age en la definición del parámetro no es la clase Age que estás definiendo, sino el parámetro de tipo que introdujiste en la función.

Por lo que puedo decir, en realidad quieres que la interfaz tome un parámetro del mismo tipo que la clase que la implementa. Para hacer esto en Typescript podemos usar this polimórfico

export interface ValueObject {
    equals(valueObject: this): boolean;
    toString(): string;
}

export class Age implements ValueObject {
    constructor(
        public readonly value: number,
    ) { }

    equals(anotherAge: Age): boolean {
        return anotherAge.value === this.value;
    }

    toString() {
        return `${this.value} year{this.value === 1 ? '' : 's'} old`;
    }
}