In una dichiarazione di metodo in TypeScript, il parametro potrebbe essere di tipo array di stringhe, booleani o numeri. Devo dichiararlo come qualsiasi [] o c'è un modo per limitare il tipo di input come su questi tre tipi?È possibile specificare il tipo di parametro come uno dei molti tipi anziché di qualsiasi tipo in TypeScript?
risposta
tipografico 1.4 introdotto Union Types quindi la risposta ora è sì, è possibile.
function myFunc(param: string[] | boolean[] | number[]): void;
L'utilizzo di un altro tipo rispetto a quelli specificati genera un errore in fase di compilazione.
Se si desidera una serie di molteplici tipi specifici, è possibile utilizzare i tipi unione anche a questo:
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.
È possibile utilizzare la funzione Sovraccarichi 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
I sovraccarichi di funzione possono essere d'aiuto. – Amr
Dal stringhe, booleani e numeri sono tipi primitivi non credo ci sia un modo semplice. Se si usasse un set di diversi tipi di oggetti, si potrebbe magari trovare una super classe e quindi specificare quella super classe nell'interfaccia del proprio metodo. D'altra parte, è possibile utilizzare l'overloading dei metodi per specificare diverse implementazioni per array di stringhe, booleani e interi.
Super classe potrebbe funzionare, un tipo in linea che contiene metodi e proprietà comuni. – Amr
No. TypeScript supporta solo un singolo TypeAnnotation opzionale in un parametro, ad es. x: string
, numero o qualsiasi, quindi non è possibile indicare un insieme di tipi consentiti.
Tuttavia, dattiloscritto supporta sovraccarichi di funzioni (documentazione P51):
sovraccarichi funzione permettono una specificazione più accurata dei modelli di invocazione supportati 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 typeof
controlli di tipo, ma questo contatori del 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!");
}
Sono d'accordo con l'idea di overload di funzioni ma il tipo di controllo del tipo non aiuta con intellisense. Immagino che la risposta alla mia domanda sia No ma ho una risposta che potrebbe davvero aiutare. Lo posterò. – Amr
Con Typescript 1.4 la risposta è ** si **. Controlla la mia risposta. – Joao
Un altro modo per risolvere questo è quello di trovare i metodi e le proprietà comuni tra i tipi di input e dichiarare un tipo in linea nella dichiarazione metodo che contiene questi methos e proprietà comune. Ti piace questa:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; }): methodResultType;
Questo sembra un po 'vecchia questione, ma in ogni caso, mi sono imbattuto, e perdere questa 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 perché del nuovo concetto dattiloscritto di "unione-tipi".
Puoi vedere di più here.
- 1. TypeScript - Cambia il tipo di proprietà in child, è possibile?
- 2. Come verificare se un tipo di modello è uno dei tipi di un tipo di variante?
- 3. TypeScript - è possibile disabilitare il controllo del tipo?
- 4. Teoria dei tipi: tipi di tipo
- 5. È possibile combinare membri di più tipi in un'annotazione TypeScript?
- 6. L'uguaglianza è decidibile su qualsiasi tipo di tipo coinduttivo?
- 7. Qual è il tipo MIME di TypeScript?
- 8. TypeScript: L'argomento del tipo per il parametro di tipo 'R' non può essere dedotto dall'uso
- 9. Swift: Qualsiasi tipo di sequenza come parametro di funzione
- 10. Come specificare più tipi di reso usando i suggerimenti tipo
- 11. Typescript - Tipi di funzione di ordine superiore
- 12. Impossibile specificare il tipo di parametro specifico nella sottoclasse
- 13. come posso passare qualsiasi tipo di parametro nell'azione UiButton?
- 14. Tipo di trasmissione utilizzando il parametro tipo
- 15. Tipi generici con parametro tipo in C#
- 16. È possibile vincolare un parametro del tipo di metodo generico C# come "assegnabile dal parametro di tipo della classe contenente"?
- 17. Ottieni il tipo di parametro generico
- 18. la classe A ha un parametro di tipo, ma il tipo B ha uno
- 19. Riferimenti di tipo circolare in TypeScript
- 20. C++ modello non-tipo tipo di parametro deduzione
- 21. Come scrivere funzione C accettare (uno) argomento di qualsiasi tipo
- 22. È possibile specificare più di un suggerimento per un parametro?
- 23. Tipo di inferenza con tipi di unione - Non esiste il miglior tipo comune
- 24. È possibile utilizzare `caso caso` con un parametro di tipo?
- 25. TypeScript: tipo della classe corrente come variabile di tipo
- 26. tipo di tipi in Java
- 27. Come passare un oggetto Noda Time (o qualsiasi tipo di terze parti) come parametro in WCF?
- 28. È possibile dedurre argomenti di tipo Java dai limiti dei parametri di tipo?
- 29. Typescript: come impostare il tipo di child in React Component?
- 30. In Java, posso specificare qualsiasi quantità di parametri di tipo generico?
Per me, sembra che possa essere una matrice costituita interamente da un tipo, in cui quel tipo potrebbe essere una stringa, un valore booleano o un numero. Che dire di un array che può contenere una miscela di soli tre tipi? –
Non sono sicuro che sia quello che ha chiesto l'OP ma ho comunque modificato la mia risposta. Ovviamente capisci che c'è una differenza tra i due. – Joao