2017-03-12 4 views
1

TypeScript Neuling hier ein vorhandenes Projekt migrieren. Wir haben Mungo-Modelle, die auf den folgenden Ausschnitt ähnlich aussehen und verwenden Sie die discriminatorKey Eigenschaft:TypeScript: Argument des Typs ist nicht zuweisbar

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

Das gibt mir die folgende Fehlermeldung während der Kompilierung:

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

Ich verwende diese @types Definition, das scheint eine der letzten zu sein:

"@types/mongoose": "^4.7.8" 

ich verstehe, dass die Typdefinitionen nicht angeben, die discriminatorKey (dies ist obviou schlau sichtbar bei node_modules/@types/mongoose/index.d.ts), aber ich verstehe nicht (a) warum (Aufsicht?) andere Version? anderer Grund?), (b) Wie kann ich diesen Fehler umgehen?

(c) Bonusfrage: Die Versionierungsstrategie der @types Definitionen ist mir noch unklar. Ich würde annehmen, dass die Typdefinitionen mit der Version der eigentlichen Bibliothek übereinstimmen sollten, jedoch scheint es oft keine passende Version zu geben - z. Wir verwenden express Version. 4.13.4, aber es gibt keine passende @types/express Version verfügbar. Was ist die beste Vorgehensweise in diesem Fall?

+0

Literale unterliegen * Excess Property Checks *. Suchen Sie nach dem Begriff auf dieser Seite: https://www.typescriptlang.org/docs/handbook/interfaces.html – cartant

Antwort

1

Ich bin ein bisschen spät, aber ich bin gerade auf das gleiche Problem gestoßen. Ich benutze @types/mongoose4.7.12 und es wurde noch nicht aktualisiert.

als zeitliche Lösungen, wenn Sie über diese Art von Problemen kommen, haben Sie zwei Möglichkeiten:

Guss die ganze problematische Objekt any

Wie Sie die Optionen inline definieren, können Sie warf sie zu any:

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

    ... 
} as any); 

oder

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

    ... 
}); 

Der Nachteil dieses Ansatzes ist nun, dass für das SchemaOptions Objekt Überprüfung geben wird für alle Eigenschaften deaktiviert werden, wenn Sie also einen Tippfehler in, lassen Sie sich sagen lassen, toJSON, und gibt toJSNO stattdessen TypeScript werden Sie nicht gewarnt.

Guss das problematische Objekt any nur in der Aussage, dass für die bekannten Eigenschaften Arbeitstypprüfung zu halten, aber deaktivieren Sie es für die noch unbekannten definieren unbekannte Eigenschaften

Ein anderer Ansatz verwendet, dass

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); 

Randbemerkung: Pleas Optionen Objekt, bevor sie mit den bekannten Eigenschaften und die unbekannten sie später any Gießen hinzufügen e, trage dazu bei!

Wenn Sie ein ähnliches Problem in diesem Paket oder in einem anderen in der Zukunft finden, ist dies eine wirklich einfache und minimale Änderung, die Sie beheben können und PR zu DefinitelyTyped.Für so etwas muss man das Repo nicht einmal klonen, ich konnte es einfach mit dem Bearbeiten-Knopf in GitHub tun.

Hier ist der PR: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/16598, sobald es zusammengeführt wird, nur auf die neueste Version aktualisieren.

+1

Vielen Dank! Ich habe in der Zwischenzeit auch meine Fähigkeiten verbessert, aber das ist immer noch eine nette Zusammenfassung aller verfügbaren Optionen! Und natürlich vielen Dank für die Verbesserung der Typings! – qqilihq

Verwandte Themen