2017-03-12 148 views
1

TypeScript newbie此处迁移现有项目。我们有猫鼬模型,类似于下面的代码片段,并使用discriminatorKey属性:TypeScript:类型的参数不可分配

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(这是obviou当看到node_modules/@types/mongoose/index.d.ts时狡猾可见),但我不明白(a)为什么(忽略?不同的版本?其他原因?),(b)我如何绕过这个错误?

(c)奖金问题:@types定义的版本策略对我而言仍不清楚。我认为,类型定义应该与实际库的版本匹配,但是,通常看起来没有匹配的版本 - 例如我们正在使用express版本。 4.13.4,但没有匹配的@types/express版本可用。在这种情况下遵循的最佳做法是什么?

+0

文字受制于*额外的财产检查*。搜索本页上的术语:https://www.typescriptlang.org/docs/handbook/interfaces.html – cartant

回答

1

我有点晚,但我刚刚遇到同样的问题。我正在使用@types/mongoose4.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对象的所有属性将被禁用,因此,如果你犯了一个错字的,比方说,toJSON,并键入toJSNO而是TypeScript不会报警。

演员有问题的对象any只是在使用未知属性

一种不同的方法,以保持类型检查的已知特性工作,但禁止它为未知的语句是定义选择与已知属性之前对象,并新增未知的以后他们铸造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); 

旁注:普莱斯e,贡献!

如果在此包或任何其他在将来找到任何类似的问题,这是一个非常简单的和最小的变化,你可以修复和公关DefinitelyTyped。实际上,对于这样的事情,你甚至不需要克隆回购,只需使用GitHub中的编辑按钮即可完成。

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

+1

谢谢!在此期间,我也提高了我的技能,但这仍然是所有可用选项的绝佳写照!当然,非常感谢您提高打字效果! – qqilihq

相关问题