Как использовать @this и function.call вместе? - PullRequest
0 голосов
/ 20 ноября 2018

Учитывая следующий код JS, при вызове bar.fun через bar.fun.call(b, 'hi'); как я могу сказать компилятору, что я хочу, чтобы this был экземпляром Banana?

/**
 * @typedef {Object} Bar
 * @property {function(this:Foo, string):number} fun
 */


class Foo {
  constructor(){
   this.n = 1;
 };
}

class Banana extends Foo {
  constructor() {
    super();
    this.b = 2;
  };
}

const b = new Banana();

/** @type {Bar} */
const bar = {
  /**
   * @this {Banana}
   * @param {string} s
   * @return {number}
   */
  fun(s) {
    return this.n + this.b + s.length; //Property 'b' does not exist on type 'Foo'
  }
};
bar.fun.call(b,'hi');

1 Ответ

0 голосов
/ 24 декабря 2018

У вас есть два противоречивых определения.В определении Bar вы говорите, что this имеет тип Foo, и позже вы аннотируете bar как имеющий тип Bar, но присваиваете несовместимый тип fun.Я думаю, что если вы не аннотируете bar и не будете делать вывод о его типе, вы получите желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...