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?
Posso specificare Tipo parametro come uno dei molti tipi Invece di qualsiasi tipo a macchina?
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.
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 .
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!");
}
È 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
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;
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.













