Я хочу сделать следующее:

class A {
  someMethod() {
    //
  }
}

class B {
  constructor (options) {
    this.dependency = options.dependency;
  }
}


class C extends B {
  test() { 
    this.dependency.a. // want a to refer to instance of A class and provide intellisense using jsdocs
  }
}

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

/**
 * @typedef {Object} WithSomeProp
 * @property {{ a: A }} prop
 * 
 * @typedef {C & WithSomeProp} extended
 */

/**
 * @type {extended}
 */
let a = {};
a.prop.a.someMethod // works (shows suggestion)
a.test // works

/**
 * @typedef {Object} WithOtherProp
 * @property {{ a: A }} dependency
 * 
 * @typedef {C & WithOtherProp} extendedTwo
 */

/**
 * @type {extendedTwo}
 */
let b = {};
b.dependency. // doesn't work
b.test // works

Итак, в целом нет никакого способа переопределить определение свойства позже в расширенных классах, чтобы получить поддержку IntelliSense?

0
Javad 3 Апр 2020 в 19:39

1 ответ

Я только что понял, что могу сделать это вместо этого (теперь я чувствую себя глупо)

class C extends B {
  constructor(options) {
    super(options);
    /**
     * @type {A}
     */
    this.a = options.dependency.a;
  }
  test() { 
    this.a.someMethod // works fine now
  }
}
1
Javad 3 Апр 2020 в 20:21