Posso specificare Tipo parametro come uno dei molti tipi Invece di qualsiasi tipo a macchina?

voti
9

In una dichiarazione di metodo a macchina, il parametro potrebbe essere di tipo array di stringhe, booleani o numeri. Devo dichiarare come qualsiasi [] o c'è un modo per limitare il tipo di ingresso come su di questi tre tipi?

È pubblicato 08/10/2012 alle 07:50
fonte dall'utente
In altre lingue...                            


6 risposte

voti
25

Carattere tipografico 1.4 ha introdotto Tipi dell'Unione quindi la risposta ora è sì, è possibile .

function myFunc(param: string[] | boolean[] | number[]): void;

Utilizzando altro tipo di quelli specificati attiverà un errore di compilazione.


Se si desidera una serie di molteplici tipi specifici, è possibile utilizzare tipi dell'Unione per quello pure:

function myFunc(param: (string|boolean|number)[]): void;

Si noti che questo è diverso da quello che ha chiesto OP per. Questi due esempi hanno significati diversi.

Risposto il 28/08/2015 a 05:21
fonte dall'utente

voti
7

Questo sembra un po 'vecchia questione, ma in ogni caso, mi sono imbattuto in esso, e perso questo altra risposta che porto.

Da dattiloscritto 1.4 sembra che sia possibile dichiarare più tipi possibili per un parametro funzione come questa:

class UtilsClass {
    selectDom(element: string | HTMLElement):Array<HTMLElement> {
        //Here will come the "magic-logic"
    }
}

Questo è dovuto al nuovo concetto dattiloscritto di "unione-tipi".

Si può vedere di più qui .

Risposto il 14/05/2015 a 09:56
fonte dall'utente

voti
1

No. dattiloscritto supporta solo un singolo TypeAnnotation optional in un parametro, ad esempio x: string, il numero o qualsiasi, quindi non è possibile dichiarare un insieme di tipi consentiti.

Tuttavia, dattiloscritto supporta sovraccarichi funzionali (documentazione P51):

sovraccarichi funzione consentono una specifica più accurata dei modelli di invocazione supportato da una funzione di quanto sia possibile con una sola firma. [...]

    function attr(name: string): string;
    function attr(name: string, value: string): Accessor;
    function attr(map: any): Accessor;
    function attr(nameOrMap: any, value: string): any {
        if (nameOrMap && typeof nameOrMap === "object") {
            // handle map case
        }
        else {
            // handle string case
        }
    }

Otherwsie è possibile utilizzare typeofi controlli di tipo, ma questo CONTATORI il tipo ascpect di tipo script un po '.

function myFunc(x){
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
        throw new TypeError("Unsupported type!");
}
Risposto il 08/10/2012 a 08:08
fonte dall'utente

voti
1

È possibile utilizzare sovraccarichi di funzioni per fare questo:

class Thing {
    public foo(x: number[]);
    public foo(x: bool[]);
    public foo(x: string[]);
    public foo(x: any[]) {
       // Note: You'll have to do type checking on 'x' manually
       // here if you want differing behavior based on type
    }
}

// Later...
var t = new Thing();
t.foo(someArray); // Note: External callers will not see the any[] signature
Risposto il 08/10/2012 a 08:07
fonte dall'utente

voti
0

Un altro modo per risolvere questo è trovare i metodi e le proprietà comuni tra i tipi di input e dichiarare un tipo in linea nella dichiarazione metodo che contiene queste methos e proprietà comuni. Come questo:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
Risposto il 08/10/2012 a 08:21
fonte dall'utente

voti
0

Dal momento che le stringhe, booleani e numeri sono tipi primitivi non credo che ci sia un modo semplice. Se si usa un insieme di diversi tipi di oggetti, si potrebbe forse trovare una classe di super e poi specificare che super classe nell'interfaccia del metodo. D'altra parte, si potrebbe anche usare overloading dei metodi per specificare diverse implementazioni per gli array di stringhe, booleani e interi.

Risposto il 08/10/2012 a 08:08
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more