Невозможно вернуть новый производный объект из функции интерфейса - PullRequest
0 голосов
/ 15 февраля 2019

Код машинописного текста не компилируется.

Вывод компилятора: ошибка TS2416: Свойство 'deepcopy' в типе 'Vector2' нельзя назначить одному и тому же свойству в базовом типе 'Vector'.

Я только вчера начал использовать машинопись, и это кажется тривиальной проблемой, но, похоже, не могу найти правильного решения проблемы.

interface Vector {
    deepcopy() : this;
}

export class Vector2 implements Vector {
    constructor() {
    }

    deepcopy() {
        return new Vector2();
    }
}

Есть предложения или подсказки?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019
interface Vector {
    deepcopy() : Vector;
}

export class Vector2 implements Vector {
    constructor() {
    }

    deepcopy() {
        return new Vector2();
    }
}

Проблема с вашим кодом в том, что this не является типом.Как следствие Vector2 не соответствует этому.Изменив его на Vector, вы можете вернуть свой экземпляр, реализующий интерфейс Vector, как хотите.

0 голосов
/ 15 февраля 2019

Я не уверен, будет ли это работать в вашем конкретном сценарии, но, возможно, попробуйте вместо этого использовать abstract class:

export abstract class Vector {
  deepcopy(): this {
    return { ...this };
  }
}
export class Vector2 extends Vector {
  constructor() {
    super();
  }
  /* custom copy logic if necessary
  deepcopy(): this {
     ...
  }
  */
}

Правильно будет набрано следующее:

const a = new Vector2(); // inferred type: Vector2
const b = a.deepcopy();  // inferred type: Vector2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...