2012-10-05 35 views
57

Tôi 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ố biến. Hãy đối tượng sau đây theo nghĩa đen là một ví dụ:Chữ ký loại TypeScript cho các hàm có số đối số biến số

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

Vì vậy mà các mã sau đây có thể biên dịch mà không có lỗi:

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

Trả lời

98

nguyên cảo sử dụng sự lây lan đề nghị ECMAScript 6,

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

nhưng thêm gõ chú thích vì vậy đây sẽ như thế nào,

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

Perfect - đối với 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 ngôn ngữ spec, nhưng nó có vẻ làm việc tốt. Cảm ơn bạn. – nxn

+3

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

+0

@PulsarBlow Ah, tôi không quen với chúng được gọi là Tham số còn lại. Cảm ơn bạn đã cho tôi biết nơi để tìm thấy chúng trong spec. – nxn

1

Chỉ cần để thêm vào câu trả lời 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ể làm ... trực tiếp trong phương pháp:

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

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else")) 
Các vấn đề liên quan