gpt4 book ai didi

node.js - TypeScript Node.js 该命令未定义

转载 作者:行者123 更新时间:2023-12-02 18:47:38 27 4
gpt4 key购买 nike

我开始写Ts,但现在我是新手。

  export class CrudController<AddDto extends CoreAddDto>{

protected readonly addDtotype: new () => AddDto;

constructor(addDtotype: (new () => AddDto)) {
this.addDtotype = addDtotype;
}

public async add(ctx: any, next: any) {

/// this undefined !!! ///
const dto = new this.addDtotype();


Object.assign(dto, ctx.request.body);

}
}

class FooController extends
CrudController<FooDto> {

constructor {
super(FooDto);
}
}

enter image description here为什么我不明白这个未定义的命令?

<小时/>

这有效

public add = async (ctx: any, next: any) => { }

方法作为属性起作用,为什么?

最佳答案

这不是错误,您的 linter 是正确的,因为您的 add 方法未绑定(bind)。 JavaScript 中的函数声明基本上有两种类型:常规函数语句和箭头函数,主要区别在于常规函数语句在其作用域内为 this 提供自己的定义,而箭头函数则绑定(bind)到当前 this 在它们定义的范围内。

所以当一个方法是普通函数时:

add(ctx: any, next: any) {
const dto = new this.addDtotype();
Object.assign(dto, ctx.request.body);
}

this 指向 add,而不是您的 CrudController,但当您将其更改为箭头时:

public add = async (ctx: any, next: any) => { }

this 未被覆盖,因此它仍然指向您的组件。请注意,您不需要对 rendercomponentDidMount 等内置方法执行此操作,只需对您定义的方法执行此操作。

所以基本上,只要您想在方法内部使用 this 来引用组件,您就应该像 method = () => {} 那样定义它。如果您非常讨厌箭头函数,您还可以在构造函数中绑定(bind)方法,如下所示:

constructor(props){
super(props)
this.add = this.add.bind(this)
this.method = this.method.bind(this)
}

TSLint有一个很好的规则可以帮助防止犯这种错误(这是一个很容易犯的错误),称为 "no-unbound-method"

关于node.js - TypeScript Node.js 该命令未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54326403/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com