2016-08-10 3 views
0

Mit dem folgenden Code;TypeScript Duck Typisierung: Erfordert nur eine Eigenschaft

interface ParamTest extends Object { 
    ids?: any; 
    model?: any; 
    params?: any; 
    pageContext?: PageContext; 
} 

class Foo { 
    public callMeWithParamsPlease(params: ParamTest): void{ 

    } 

    public nope() { 
     this.callMeWithParamsPlease("hi"); 
    } 
} 

Ich weiß nicht, was ich als Parameter geliefert werden. Aber ich weiß, dass mindestens eine der Felder ausgefüllt werden muss. Wenn ich benutze:

export interface ApiServiceOpts extends Object { 
    ids?: any; 
    model?: any; 
    params?: any; 
    pageContext: PageContext; 
} 

Dann ist es nicht mehr kompatibel mit Schnur, wie zu erwarten - weil String nicht pageContext hat. Ich weiß jedoch nicht genau, ob der pageContext geliefert wird - aber ich weiß, dass mindestens eines der Felder geliefert werden muss. Gibt es eine magische Schreibmaschinensyntax, die dies erlaubt?

Vielleicht etwas wie;

interface PageContext {} 


export interface ParamTestId { 
    ids: any; 
} 

export interface ParamTestModel { 
    model: any; 
} 

export interface ParamTestParams { 
    params: any; 
} 

export interface ParamTestPageContext { 
    pageContext: PageContext; 
} 

class Foo { 
    public callMeWithParamsPlease(params: ParamTestId & ParamTestModel & ParamTestParams & ParamTestPageContext): void { 
     params.ids.a = ""; 
     params.model.b = {} 
    } 

    public nope() { 
     this.callMeWithParamsPlease("hi") 
    } 
} 
+0

Es ist nicht klar, was Sie fragen. '" es ist nicht länger kompatibel mit string "' - wann war es jemals mit einer string kompatibel, was ist das "es"? Nein, wo in Ihrem Code haben Sie einen String-Parameter. Warum würden Sie auch "Objekt" erweitern? –

Antwort

0

Ich würde folgendes vorschlagen:

  • Object Erweiterung fügt nichts, Ihre Schnittstelle ist bereits ein Objekt. Entferne das.
  • Ihre Art war kompatibel mit string weil ein string ist auch ein Object, aber Sie sollten nicht darauf verlassen, anstatt Art Gewerkschaften verwenden ausdrücklich darauf hin, dass Sie Objekte oder Strings akzeptieren, dh

    callMe(params:ParamTest|string) { 
        // params may be a string now regardless of ParamTest's definition. 
    } 
    
  • Bei dieser Punkt Sie Typ Wachen zu überprüfen, was Sie tatsächlich bekam in den params, also verwenden sollte:

    interface ParamTest { 
        ids:string[]; 
        paramContext:string; 
    } 
    class Foo { 
        callMeMaybe(params:ParamTest|string) { 
        if (params instanceof String) { 
         // Cool it's a string. 
         let x = params.charCodeAt(0); 
        } else { 
         let m = params.ids; 
        } 
        } 
    } 
    
+0

Ich bin mir nicht sicher, ob Sie die Frage verstanden haben; 'ParamTest' ist kompatibel mit dem Typ' string'. Obwohl die Funktion explizit einen 'ParamTest' akzeptiert, kann eine Zeichenfolge an sie übergeben werden, da alle Eigenschaften optional sind. – David

Verwandte Themen