Değişken bağımsız değişken sayılarına sahip işlevler için TypeScript tipi imzalar


108

Değişken miktarda bağımsız değişken kabul eden işlev üyeleriyle arabirimleri tanımlarken sorun yaşıyorum. Örnek olarak aşağıdaki nesne değişmezini alın:

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

Şunun gibi bir arayüz tanımlayabilmek istiyorum:

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

Böylece aşağıdaki kod hatasız derlenebilir:

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

Yanıtlar:


205

TypeScript, ECMAScript 6 yayma teklifini kullanır,

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

ancak tür ek açıklamaları ekler, böylece bu şöyle görünür:

interface Example {
    func(...args: any[]): void;
}

Mükemmel - bazı nedenlerden dolayı bu konuda dil spesifikasyon belgesinde hiçbir şey bulamadım, ancak gayet iyi çalışıyor gibi görünüyor. Teşekkür ederim.
nxn

4
@nxn Özelliklerdeki 50/51. sayfa: RestParameter
AM

@PulsarBlow Ah, onların Rest Parameters olarak adlandırılmasına aşina değildim. Bunları şartnamede nerede bulacağımı bana bildirdiğiniz için teşekkür ederim.
nxn

7
@JanusTroelsen Çok geç kaldığımı anlıyorum ama bu yazıya rastlayanlar için RestParameter'ı bir dizi olarak işaretlemeyi unutmadığınızdan emin olun. ...args:any[]doğru ama ...args:anydeğil.
GuiSim

1
@AlexanderMills func, işlevin adıdır.
Bob Vale

5

Sadece chuck'ın cevabına eklemek için, bu şekilde tanımlanmış bir arayüze ihtiyacınız yok. Sadece yapabilirsiniz ...yöntemde doğrudan:

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

O zaman arayabilirsin:

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

Veya

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

0

... args [] argümanı kullanılmıyorsa Typescript yine de Javascript'te bir dizi oluşturur ve argümanları ona kopyalar.

Bu gereksizliği önlemek için, işlevin yanı sıra işlev için de bir prototip oluşturabilirsiniz, böylece: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.