2017-03-12 7 views
1

ここで、TypeScript newbieは既存のプロジェクトを移行します。 、私はこれらの@types定義を使用していTypeScript:型の引数を代入することができません。

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'. 

:これは私のコンパイル中に次のエラーを与える

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

:私たちは、次のコードに似た外観とdiscriminatorKeyプロパティを使用マングースモデルを、持っています最も最近のものであるように思われた:

"@types/mongoose": "^4.7.8" 

私は理解して、型定義がdiscriminatorKeyを指定していないこと(これはobviou私が理解していないのはなぜですか(監視していますか?別のバージョン?他の理由?)、(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

に全体の問題のオブジェクトをキャスト:あなたは問題のこの種に遭遇したときに

一時的な解決策として、次の2つのオプションがありますanyにそれらをキャスト:

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

    ... 
} as any); 

または

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

    ... 
}); 

このアプローチの欠点は今、すべてのプロパティで無効になりますそのSchemaOptionsオブジェクトのための型チェックということですので、あなたがタイプミスで作る場合、のは、toJSONを言わせて、そして、TypeScriptは警告を表示しません代わりにtoJSNOを入力します。

キャストだけの既知の特性のために働いて型チェックを保つが、まだ不明なもののためにそれを無効にするには、未知のプロパティ

異なるアプローチを使用するステートメントで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、貢献する!

このパッケージでも同様の問題が見つかった場合は、これを修正してPRにすることができる、非常に簡単で最小限の変更です。DefinitelyTyped。実際には、このようなものについては、リポジトリを複製する必要はなく、GitHubの編集ボタンを使用するだけでリポジトリを複製することができました。

ここでPR:https://github.com/DefinitelyTyped/DefinitelyTyped/pull/16598がマージされると、最新のバージョンに更新されます。

+1

ありがとうございます!その間に私のスキルも進歩しましたが、それでも利用可能なすべてのオプションの本当に素敵な記事です!もちろん、タイピングを改善してくれてありがとう! – qqilihq

関連する問題