给出以下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');
答案 0 :(得分:0)
您有两个相互矛盾的定义。在Bar
的定义中,您说this
的类型为Foo
,后来您将bar
注释为类型为Bar
,但给出了一个不兼容的类型到fun
。我认为,如果不注释bar
并推断其类型,就会得到想要的行为。