Typ strojopis podpisy pro funkce s proměnnými počty argumentů

hlasů
61

Mám potíže vymezuje styčné body s členy funkcí, které přijímají různá množství argumentů. Vezměte následující objekt doslovný jako příklad:

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

Rád bych, aby bylo možné definovat rozhraní, jako je například:

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

Takže následující kód lze sestavit bez chyby:

var test = (o: IExample) {
    o.func(a);
    o.func(a, b);
    o.func(a, b, c);
    ...
}
Položena 05/10/2012 v 04:40
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
106

Strojopisem používá šíření návrh ECMAScript 6,

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

ale přidává typ anotací, takže by to vypadat,

interface IExample {
    func(...args: any[]): void;
}
Odpovězeno 05/10/2012 v 04:53
zdroj uživatelem

hlasů
2

Stačí přidat do odpovědi Chuckovou, nemusíte mít rozhraní definované jako takové. Stačí provést ...přímo v metodě:

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

Pak můžete volat:

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

Nebo

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
Odpovězeno 04/02/2018 v 12:49
zdroj uživatelem

hlasů
0

Je-li ... args [] argument, který nebyl použit na psacím stroji stále vytvoří pole v JavaScriptu a kopíruje argumenty k tomu.

Aby se tomu zabránilo unnecessariness můžete vytvořit prototyp pro funkce, stejně jako funkce, tedy: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Odpovězeno 21/05/2018 v 14:34
zdroj uživatelem

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