2012-10-08 17 views

Respuesta

23

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.

+0

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? –

+0

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

1

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 
+0

Las sobrecargas de función pueden ayudar. – Amr

0

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.

+0

Super clase podría funcionar, un tipo en línea que contiene métodos y propiedades comunes. – Amr

1

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!"); 
} 
+0

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

+0

Con Typescript 1.4 la respuesta es ** sí **. Verifica mi respuesta. – Joao

0

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; 
6

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.

Cuestiones relacionadas