Chữ ký kiểu TypeScript cho các hàm có số lượng đối số thay đổi


107

Tôi đang gặp sự cố khi xác định giao diện với các thành viên hàm chấp nhận số lượng đối số thay đổi. Lấy đối tượng theo nghĩa đen sau đây làm ví dụ:

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

Tôi muốn có thể xác định một giao diện như:

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

Để mã sau có thể biên dịch mà không bị lỗi:

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

Câu trả lời:


205

TypeScript sử dụng đề xuất chênh lệch ECMAScript 6,

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

nhưng thêm chú thích loại để nó trông giống như,

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

Hoàn hảo - vì một số lý do tôi không thể tìm thấy bất cứ điều gì về điều này trong tài liệu đặc tả ngôn ngữ, nhưng nó có vẻ hoạt động tốt. Cảm ơn bạn.
nxn

4
@nxn Trang 50/51 trong thông số kỹ thuật: RestParameter
AM

@PulsarBlow Ah, tôi không quen với việc chúng được gọi là Tham số nghỉ. Cảm ơn bạn đã cho tôi biết nơi để tìm chúng trong thông số kỹ thuật.
nxn

7
@JanusTroelsen Tôi nhận ra rằng mình đã đến rất muộn nhưng đối với bất kỳ ai tình cờ xem được bài đăng này, hãy đảm bảo rằng bạn không quên đánh dấu RestParameter dưới dạng một mảng. ...args:any[]là đúng nhưng ...args:anykhông phải.
GuiSim

1
@AlexanderMills func là tên của hàm.
Bob Vale,

5

Chỉ để thêm vào câu trả lời của chuck, bạn không cần phải có một giao diện được định nghĩa như vậy. Bạn chỉ có thể thực hiện ...trực tiếp trong phương thức:

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

Sau đó, bạn có thể gọi nó là:

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

Hoặc là

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

0

Nếu đối số ... args [] không được sử dụng Loại chỉ thị vẫn tạo một mảng trong Javascript và sao chép các đối số vào đó.

Để tránh sự không cần thiết này, bạn có thể tạo một nguyên mẫu cho hàm cũng như hàm, do đó: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.