las firmas de tipos mecanografiado para funciones con un recuento de argumentos variables

votos
61

Tengo problemas para definir las interfaces con los miembros de la función que aceptan cantidades variables de argumentos. Tomemos el siguiente objeto literal como ejemplo:

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

Por lo que el siguiente código puede compilar sin errores:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
Publicado el 05/10/2012 a las 04:40
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
106

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;
}
Respondida el 05/10/2012 a las 04:53
fuente por usuario

votos
2

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

A continuación, 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"))
Respondida el 04/02/2018 a las 09:49
fuente por usuario

votos
0

Si el ... args [] argumento no se utiliza imprenta todavía crea una matriz en el Javascript y copia los argumentos a ella.

Para evitar esto no necesidad se puede hacer un prototipo de la función, así como la función, por lo tanto: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Respondida el 21/05/2018 a las 11:34
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more