2017-09-30 3 views
1

Ich schreibe eine library und ich möchte es in Typoskript portieren.Typescript deklariert eine Funktion mit Eigenschaften

es aussehen Zur Zeit etwas wie folgt aus:

index.js

const is = value => { 
    ... do some returns here 
} 

is.number = x => typeof x === 'number' 
is.bla = x => typeof x === 'bla' 

und so weiter.

Ich habe eine Schnittstelle beschrieben is und alle ihre Methoden.

type TypeQueryMethod = (val: any) => boolean; 

interface Is { 
    (val: any): string; 
    undefined: TypeQueryMethod; 
    null: TypeQueryMethod; 
    ... 
} 

Wenn ich versuche, is mit dem Typ zu markieren: const is: Is = value => ...

Es wirft einen Fehler:

Type '(value: any) => string' is not assignable to type 'Is'. 
Property 'undefined' is missing in type '(value: any) => string'. 

Welche sinnvoll, weil die Deklaration des Objekts macht aufgeteilt wird.

Wie konstruieren Sie ein solches Objekt, das sowohl eine Methode als auch Methoden hat?

Antwort

1

Sie können eine Funktion und ihre Eigenschaften nicht gleichzeitig implementieren. Sie können die Funktion zuerst definieren und zu Is behaupten und den Rest der Methoden definieren:

const is = ((val: any) => typeof (val)) as any as Is; 

is.null = (val) => true; 
is.undefined = (val) => true; 

Oder eine Fabrik-Funktion verwenden Is zu erstellen:

function createIs(): Is { 
    const is = ((val: any) => { 
     return ""; 
    }) as Is; 
    is.null = (val) => true; 
    is.undefined= (val) => true; 
    return is; 
} 

const is: Is = createIs(); 
+0

Sie sollten in der Lage sein, 'Object.assign()' zu verwenden, um ein 'Is' ohne Typzusicherungen zu erstellen. – jcalz

0

Wenn Sie die Art Kontrolleur machen wollen glücklich, können Sie Object.assign() verwenden, um ein vollständig geformtes Is Objekt zurückzukehren, ohne es in Etappen zu bauen:

const is: Is = Object.assign(
    (val: any) => typeof val, 
    { 
    undefined: (val: any) => typeof val === 'undefined', 
    null: (val: any) => (val === null) 
    // ... 
    } 
); 

Natürlich, wenn Sie nicht die Struktur Ihres Codes ändern möchten, dann können Sie tun, wie @Saravana schlägt vor und verwenden Sie eine type assertion, um nur die Typüberprüfung zu informieren, dass is definitiv eine Is ist, obwohl es technisch nicht ist bis du fertig bist, es zu bauen.

So oder so funktioniert, aber ich ziehe die Object.assign() Methode, weil die Typprüfer warnt Sie, wenn Sie vernachlässigen, etwas zu implementieren:

// error, "undefined" is missing 
const is: Is = Object.assign(
    (val: any) => typeof val, 
    { 
    null: (val: any) => (val === null) 
    // ... 
    } 
); 

während die Art Behauptung Methode nicht:

const is = ((val: any) => typeof val) as any as Is; 
is.null = (val) => val === null; 
// no error 

während die type assertion method nicht. Es liegt an dir. Ich hoffe, das hilft; Viel Glück!

Verwandte Themen