2016-05-11 8 views
0

Ich habe eine Funktion, die eine Suche durchführt. Die Suche kann auf verschiedene Arten erfolgen (durch Suchen nach einer ID oder durch Abfragen einiger Attribute). Ich möchte jedoch beschränken, was in weitergegeben werden Attribute kann ich dachte, dass ich so etwas tun könnte.Können mit Typoskriptschnittstellen Attribute gelöscht werden, die nicht in der Schnittstelle definiert sind?

interface Search { 
    _id?: string 
    people?: number 
    partyName?: string 
    otherField? string 
} 

function search(query: Search) { 
    myDbConnection.find(query).then(... // etc 
} 

Das Problem ist, dass jedes Objekt dazu anpaßt und query zusätzliche Attribute enthalten. Zum Beispiel könnte dies übergeben werden:

search({otherField: "foo", aProtectedField: "bar"}) 

und aProtectedField würde entlang zu find weitergegeben werden.

Ich frage mich, ob es eine Typoskript Möglichkeit gibt, die übergebenen Attribute zu erzwingen. Eine Art von starken Parametern aus der Rails-Welt. Ich weiß, ich kann Dinge wie Form lodash oder vielleicht sogar eine SearchObject Klasse machen und den Konstruktor als Mittel verwenden, um die zusätzlichen Attribute zu verwerfen, aber ich habe das Gefühl, es gibt eine Möglichkeit, dies innerhalb Typoskript zu tun, die ich einfach nicht weiß Über.

Antwort

0

Sie können alle erforderlichen Eigenschaften festlegen und dann eine Assertion ausführen, um eine Teilmenge der Eigenschaften zu übergeben.

Zum Beispiel:

interface Search { 
    _id: string; 
    people: number; 
    partyName: string; 
    otherField: string; 
} 

function search(query: Search) { 
    // code here 
} 

search({ people: 2 } as Search); // ok 
search({ otherField: "foo", aProtectedField: "bar" }); // error, good 
search({ otherField: "foo", aProtectedField: "bar" } as Search); // error, good 
0

Welche Version von Typoskript sind bei Ihnen hinterlassen? Seit Typescript 1.6 gibt es improved checking for object literals.

Auf TS 1.8, wenn ich versuche, den Code auszuführen, erhalte ich:

Fehler TS2345: Argument vom Typ ‚{otherField: string; aProtectedField: Zeichenfolge; } 'ist keinem Parameter des Typs' Suchen 'zuweisbar. Objektliteral darf nur bekannte Eigenschaften angeben, und 'aProtectedField' existiert nicht im Typ 'Suchen'.

Diese und noImplicitAny sollten die Fehler erfassen, um die Sie sich sorgen.

0

Ich möchte einschränken, welche Attribute übergeben werden können. [...] Abfrage kann zusätzliche Attribute enthalten.

Die Art, wie ich es sehe, ist umstritten. Wenn Sie festlegen, welche Attribute ein bestimmtes Objekt enthalten soll, ist es per Definition auf diese Menge von Attributen beschränkt und darf keine anderen Attribute enthalten, die von den Spezifikationen nicht zugelassen sind.

Da es so gut wie nichts ist man über die any Art zu tun, meine Empfehlung ist dies die typsichere Art und Weise zu lösen, indem Sie eine Option für zusätzliche Attribute definieren:

interface Search { 
    _id?: string; 
    people?: number; 
    partyName?: string; 
    additionalFields?: { [key: string]: any }; 
} 
search({ people: 2 }); // ok 
search({ _id: "jd", people: 2 }); // ok 
search({ _id: "jd", additionalFields: { otherField: "foo" } }); // ok 
Verwandte Themen