2017-03-12 74 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

相關問題