En una declaración de método en TypeScript, el parámetro podría ser de tipo array de cadenas, booleanos o números. ¿Tengo que declararlo como cualquier [] o hay una manera de limitar el tipo de entrada como en estos tres tipos?¿Puedo especificar el tipo de parámetro como uno de muchos tipos en lugar de cualquier tipo en TypeScript?
Respuesta
imprenta 1.4 introducido Union Types así que la respuesta es ahora sí, usted puede.
function myFunc(param: string[] | boolean[] | number[]): void;
El uso de un tipo diferente al especificado provocará un error de tiempo de compilación.
Si desea una matriz de múltiples tipos específicos, puede utilizar tipos de unión para eso también:
function myFunc(param: (string|boolean|number)[]): void;
Tenga en cuenta que esto es diferente de lo que pidió OP. Estos dos ejemplos tienen diferentes significados.
función Puede utilizar sobrecargas de hacer esto:
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
Las sobrecargas de función pueden ayudar. – Amr
Como las cadenas, booleanos y los números son tipos primitivos no creo que hay una manera sencilla. Si utilizara un conjunto de diferentes tipos de objetos, tal vez podría llegar a una súper clase y luego especificar esa superclase en la interfaz de su método. Por otro lado, también puede usar la sobrecarga de métodos para especificar diferentes implementaciones para matrices de cadenas, booleanos y números enteros.
Super clase podría funcionar, un tipo en línea que contiene métodos y propiedades comunes. – Amr
No. TypeScript admite solo una única Anotación de Tipo en un parámetro, p. x: string
, número o cualquiera, por lo que no puede establecer un conjunto de tipos permitidos.
Sin embargo, mecanografiado soporta sobrecargas de función (documentación p51):
sobrecargas de función permiten una especificación más exacta de los patrones de invocación soportados por una función que es posible 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 puede utilizar los controles de tipo typeof
, pero esto contradice la ascpect tipo de Tipo Guión un poco.
function myFunc(x){
if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
throw new TypeError("Unsupported type!");
}
Estoy de acuerdo con la idea de sobrecarga de funciones pero el tipo de verificación de tipo no ayuda con intellisense. Supongo que la respuesta a mi pregunta es No, pero tengo una respuesta que realmente podría ayudar. Lo publicaré. – Amr
Con Typescript 1.4 la respuesta es ** sí **. Verifica mi respuesta. – Joao
Otra forma de resolver esto es encontrar los métodos y propiedades comunes entre los tipos de entrada y declarar un tipo de línea en la declaración del método que mantiene estos methos y propiedades comunes. De esta manera:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; }): methodResultType;
esto parece un poco vieja pregunta, pero de todos modos, me encontré con él, y se perdió esta otra respuesta que les traigo.
De mecanografiado 1.4 parece que es posible declarar múltiples tipos posibles para un parámetro función como esta:
class UtilsClass {
selectDom(element: string | HTMLElement):Array<HTMLElement> {
//Here will come the "magic-logic"
}
}
Esto es debido al nuevo concepto de "unión mecanografiado-tipos".
Puedes ver más here.
- 1. TypeScript: tipo de devolución vacía convertida a cualquier tipo?
- 2. ¿Cómo especificar el parámetro IN que como tipo de datos Oracle de tipo TABLE?
- 3. especificar el tipo de parámetro de función, pero no variables
- 4. ":" en el parámetro de tipo
- 5. ¿Cómo puedo anotar tipos recursivos en TypeScript?
- 6. Tipo de parámetro Tipo de
- 7. clase A tiene un parámetro de tipo, pero el tipo B tiene uno
- 8. Cómo especificar el parámetro para el método de extensión de tipo de lista genérico en C#
- 9. Tipos genéricos con parámetro de tipo en C#
- 10. puedo especificar mi tipo explícita en línea comparador?
- 11. ¿Cómo puedo determinar el tipo (por ejemplo, muchos a uno) de una relación dinámica de SQLAlchemy?
- 12. Scala: cómo especificar varargs como tipo?
- 13. ¿Por qué Seq.contains acepta el tipo Any en lugar del parámetro de tipo A?
- 14. 2 de uno a muchos en lugar de 1 de muchos a muchos
- 15. ¿Realmente necesita especificar el atributo de tipo?
- 16. C#: ¿se usa el tipo de "auto" como parámetro genérico?
- 17. Cualquier tipo de atributo "Oculto" en System.ComponentModel.DataAnnotations?
- 18. ¿cómo puedo pasar cualquier tipo de parámetro en la acción UiButton?
- 19. El tipo debe ser un tipo de referencia para usarlo como parámetro 'T' en el tipo o método genérico
- 20. Cómo puedo comparar cualquier tipo numérico a cero en C#
- 21. Clase genérica con parámetro de tipo restringido
- 22. ¿Por qué no puedo usar tipos de referencia como el tipo de valor de un tipo de contenedor?
- 23. Tipo anulable como un parámetro genérico posible?
- 24. ¿Cómo puedo saber el tipo de parámetro de websocket onmessage?
- 25. El parámetro de tipo no se extiende tipo dado
- 26. ¿Por qué no puedo usar un argumento de tipo en un parámetro de tipo con múltiples límites?
- 27. Java Tipo de parámetro formal definición (Genéricos)
- 28. ¿Interfaz como tipo en Java?
- 29. ¿Qué significa '#' en un parámetro de tipo?
- 30. Tipo de argumento de cierre de parámetro múltiple no deducido
Para mí, parece que puede ser una matriz que consiste en un solo tipo, donde ese tipo podría ser string, boolean o number. ¿Qué pasa con una matriz que puede contener una mezcla de solo esos tres tipos? –
No estoy seguro de que eso sea lo que el OP solicitó, pero edité mi respuesta de todos modos. Obviamente, entiendes que hay una diferencia entre los dos. – Joao