2017-03-01 1 views
1

ich will eine überladene Funktion wieflowtype: Wie kann ich Funktionsrückgabetypen durch Argumentzählung/Typen überladen?

function first(n?: number) { 
    if (number === undefined) { 
    // returns a single Item 
    return items[0]; 
    } 

    // returns an array of Item 
    return items.slice(0, n); 
} 

so dass diese Aussagen überprüfen Typ definieren:

const item: Item = first(); // no args, so return type is Item 
const items: Array<Item> = first(5); // number arg, so return type is Array<Item> 

Flow weiß, dass der erste Aufruf von first in n === undefined führen wird (da es sich beschweren würde wenn undefined war nicht gültig für n) und es versteht, dass es dann die if-Zweig nehmen wird, so würde ich denken, es könnte die Rückgabetyp ist Item, aber alles, was ich versucht habe entweder lässt alles passieren oder immer scheitert.

eine Idee, wenn das möglich ist? Danke im Voraus Internet.

Antwort

1

ich für Sie keine vollständige Lösung, aber ich habe es partway:

const items = [1, 2, 3]; 

type FirstType = ((_: void) => number) & ((n: number) => Array<number>); 

const first: FirstType = (n?: number) => { 
    if (n === undefined) { 
    // returns a single Item 
    return (items[0]: any); 
    } else { 
    // returns an array of Item 
    return (items.slice(0, n): any); 
    } 
} 

const a: number = first(); 
const b: Array<number> = first(2); 

(tryflow)

Die & ist ein Kreuzungstyp, und es bedeutet, dass firsterfüllen muss, beide dieser Typen. Sie können sehen, dass die Anrufe an first() typecheck wie Sie wollen.

Leider scheint Flow derzeit nicht in der Lage zu sein, den Körper von first zu überprüfen. Beachten Sie, dass ich die Rückgabewerte über any umwandeln musste, um den Typchecker zu umgehen. Wenn Sie im Hauptteil Ihrer Funktion auf die Typprüfung verzichten möchten, können Sie es zumindest dort finden, wo die Funktionen aufgerufen werden.

+0

ja ... das funktioniert! Ich kann nicht sagen, dass ich wirklich verstehe, warum du die 'any'-Besetzung brauchst ... aber es funktioniert. Vielen Dank. und ich wusste auch nicht von dieser "tryflow" -Seite, das ist super nützlich für das Fiedeln. – nrser

+0

Nur eine Warnung, durch Casting ist unsicher. Sie erhalten keine Typprüfung für die Rückgabewerte. –

Verwandte Themen