2012-10-05 28 views
57

Tengo problemas para definir interfaces con miembros de funciones que aceptan cantidades variables de argumentos. Tomemos el siguiente objeto literal como ejemplo:Firmas de tipo TypeScript para funciones con conteos de argumentos variables

var obj = { 
    func:() => { 
     for(var i = 0; i < arguments.length; i++) { 
      console.log(arguments[i]); 
     } 
    } 
}; 

me gustaría ser capaz de definir una interfaz como:

interface IExample { 
    func: (???) => void; 
} 

Para que el código siguiente se puede compilar sin errores:

var test = (o: IExample) { 
    o.func("a"); 
    o.func("a", "b"); 
    o.func("a", "b", "c"); 
    ... 
} 

Respuesta

98

mecanografiado utiliza la propuesta de difusión de ECMAScript 6,

http://wiki.ecmascript.org/doku.php?id=harmony:spread

pero añade escribir anotaciones por lo que este se vería así,

interface IExample { 
    func(...args: any[]): void; 
} 
+0

Perfecto - por alguna razón yo no era capaz de encontrar algo sobre esto en el documento de especificación de idioma, pero parece funcionar bien. Gracias. – nxn

+3

@nxn Página 50/51 en las especificaciones: RestParameter –

+0

@PulsarBlow Ah, no estaba familiarizado con que se llamaran Rest Parameters. Gracias por dejarme saber dónde encontrarlos en la especificación. – nxn

1

sólo para añadir a la respuesta de la tirada, no se necesita tener una interfaz definida como tal. Usted sólo puede hacer lo ... directamente en el método:

class Header { constructor(public name: string, public value: string) {} } 

getHeaders(...additionalHeaders: Header[]): HttpHeaders { 
    let headers = new HttpHeaders(); 
    headers.append('Content-Type', 'application/json') 

    if (additionalHeaders && additionalHeaders.length) 
     for (var header of additionalHeaders) 
      headers.append(header.name, header.value); 

    return headers; 
} 

Entonces se le puede llamar:

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken())) 

O

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else")) 
Cuestiones relacionadas