Node + TypeScript:“this”隐含类型“any”
Posted
技术标签:
【中文标题】Node + TypeScript:“this”隐含类型“any”【英文标题】:Node + TypeScript: 'this' implicitly has type 'any' 【发布时间】:2020-12-17 19:43:16 【问题描述】:我遇到了无法解决的 TypeScript 问题:
我正在使用 mongoose 架构的 post 函数在用户注册后立即为他/她生成一个配置文件(配置文件模型)(通过用户模型)。
我收到与 this 相关的类型 error。即使代码工作正常。所以我正在使用 ** // @ts-ignore **
接口:
interface UserAttrs
firstName: string;
lastName: string;
email: string;
password: string;
interface UserDoc extends mongoose.Document
firstName: string;
lastName: string;
email: string;
password: string;
// adding custom build function
interface UserModel extends mongoose.Model<UserDoc>
build(attrs: UserAttrs): UserDoc;
更多代码:
// schema
const userSchema = new mongoose.Schema(
firstName: type: String, required: true ,
lastName: type: String, required: true ,
email: type: String, required: true ,
password: type: String, required: true
, // schema options
toJSON:
transform(doc, ret)
ret.id = ret._id;
delete ret._id;
delete ret.password;
delete ret.__v;
);
// generate profile for user
userSchema.post('save', async function ()
// @ts-ignore <---- TS ERROR
let firstName = this.get('firstName');
// @ts-ignore <---- TS ERROR
let lastName = this.get('lastName');
// @ts-ignore <---- TS ERROR
let user = this.get('id');
// @ts-ignore
const profile = new Profile(
firstName, lastName, user
)
await profile.save();
)
// configuring custom build function
userSchema.statics.build = (attrs: UserAttrs) =>
// builds a new user for us
return new User(attrs);
const User = mongoose.model<UserDoc, UserModel>('User', userSchema)
export User
非常感谢您的帮助,这让我发疯了。
【问题讨论】:
【参考方案1】:Schema
的post()
方法回调函数的类型中没有指定this
的类型。无论如何它都可以工作,因为 this
的值在 javascript 中可能是一件复杂的事情,但它并没有声明以这种方式工作。
如果你想要新创建的文档,那么 that actually gets passed in as an argument 到回调。
userSchema.post('save', async (newUser) =>
let firstName = newUser.get('firstName');
let lastName = newUser.get('lastName');
let user = newUser.get('id');
//...
Playground
【讨论】:
非常感谢。工作并理解。以上是关于Node + TypeScript:“this”隐含类型“any”的主要内容,如果未能解决你的问题,请参考以下文章
带有泛型的 Typescript JSX - 参数隐式具有“任何”类型
如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换
TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型
Typescript 元素隐式地具有任何类型,带有 for...in 循环