gpt4 book ai didi

javascript - TypeScript:类型参数不可分配

转载 作者:行者123 更新时间:2023-11-30 15:27:33 28 4
gpt4 key购买 nike

TypeScript 新手在这里迁移现有项目。我们有 Mongoose 模型,它看起来类似于以下代码段并使用 discriminatorKey 属性:

const task = new mongoose.Schema({
name: {
type: String
},
notes: {
type: String
}
}, {
discriminatorKey: 'type',
toObject: {
virtuals: true
},
toJSON: {
virtuals: true
}
});

这在编译期间给我以下错误:

src/models/task.ts(12,3): error TS2345: Argument of type '{ discriminatorKey: string; }' is not assignable to parameter of type 'SchemaOptions'.
Object literal may only specify known properties, and 'discriminatorKey' does not exist in type 'SchemaOptions'.

我正在使用这些 @types 定义,这似乎是最新的定义:

"@types/mongoose": "^4.7.8"

我明白,类型定义没有指定 discriminatorKey(这在查看 node_modules/@types/mongoose/index.d.ts 时显然可见) , 但我不明白 (a) 为什么(疏忽?不同版本?其他原因?),(b) 我怎样才能避免这个错误?

(c) 奖励问题:@types 定义的版本控制策略对我来说仍然不清楚。我会假设,类型定义应该与实际库的版本相匹配,但是,通常似乎没有匹配的版本——例如我们正在使用 express 版本。 4.13.4,但没有可用的匹配 @types/express 版本。在这种情况下应遵循的最佳做法是什么?

最佳答案

我来晚了一点,但我刚遇到同样的问题。我正在使用 @types/mongoose 4.7.12,它还没有更新。

作为临时解决方案,当您遇到此类问题时,您有两种选择:

🤦 将整个有问题的对象转换为 any

在定义内联选项时,您可以将它们转换为 any :

const task: mongoose.Schema = new mongoose.Schema({ ... }, {
discriminatorKey: 'type',

...
} as any);

const task: mongoose.Schema = new mongoose.Schema({ ... }, <any> {
discriminatorKey: 'type',

...
});

这种方法的缺点是现在需要对 SchemaOptions 进行类型检查object 的所有属性都将被禁用,因此如果您打错字,比方说,toJSON,然后键入 toJSNOTypeScript 将不警告你。

👌 仅在使用未知属性的语句中将有问题的对象转换为 any

保持类型检查对已知属性起作用但对尚未未知属性禁用它的另一种方法是在使用已知属性之前定义该选项对象,然后添加未知属性,然后将它们强制转换为任何:

const options: mongoose.SchemaOptions = {
toObject: { virtuals: true },
toJSON: { virtuals: true },
};

(options as any).discriminatorKey = 'type';

// or (<any> options).discriminatorKey = 'type';

const task = new mongoose.Schema({ ... }, options);

🙏 旁注:请贡献!

如果您在此包或将来的任何其他包中发现任何类似问题,这是一个非常简单且最小的更改,您可以修复并 PR 到 DefinitelyTyped .实际上,对于这样的事情,您甚至不需要克隆存储库,我只需使用 GitHub 中的编辑按钮就可以做到这一点。

这是公关:https://github.com/DefinitelyTyped/DefinitelyTyped/pull/16598 ,一旦合并,只需更新到最新版本即可。

关于javascript - TypeScript:类型参数不可分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42752684/

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