2016-05-30 43 views
11

Tôi đã phương pháp khai thác gỗ sau:nguyên cảo tùy chọn chung kiểu

private logData<T, S>(operation: string, responseData: T, requestData?: S) { 
    this.logger.log(operation + ' ' + this.url); 
    if (requestData) { 
     this.logger.log('SENT'); 
     this.logger.log(requestData); 
    } 
    this.logger.log('RECEIVED'); 
    this.logger.log(responseData); 
    return responseData; 
    } 

Các requestData là không bắt buộc, tôi muốn để có thể gọi logData mà không cần phải xác định loại S khi tôi không gửi requestData để phương thức: thay vì: this.logData<T, any>('GET', data), tôi muốn gọi số this.logData<T>('GET', data). Có cách nào để đạt được điều này?

+0

Có thể quá tải hàm thay thế? Hoặc có thể thử sử dụng tham số mặc định. –

+1

Tôi không nghĩ rằng nó có thể quá tải, nếu tôi làm một cái gì đó như 'private logData (hoạt động: string, responseData: T)' và 'private logData (hoạt động: string, responseData: T, requestData: S)' I sẽ nhận được lỗi định nghĩa hàm trùng lặp – Marius

Trả lời

4

Theo nguyên cảo 2.2 (bạn có thể thử nó trong TS Playground), gọi this.logData("GET", data) (với data loại T) được suy ra thành công như this.logData<T, {}>("GET", data).

Quá tải do đề xuất của David Bohunek có thể được áp dụng nếu suy luận không thành công với phiên bản TS bạn sử dụng. Dù sao, đảm bảo rằng chữ ký thứ hai là trước khi khai báo và sau đó được xác định, nếu không nó sẽ không tham gia vào quá tải có sẵn.

// Declarations 
private logData<T>(operation: string, responseData: T); 
private logData<T, S>(operation: string, responseData: T, requestData?: S); 
// Definition 
private logData<T, S>(operation: string, responseData: T, requestData?: S) { 
    // Body 
} 
0

Bạn có thể viết phương pháp quá tải như thế này:

private logData<T>(operation: string, responseData: T); 
private logData<T, S>(operation: string, responseData: T, requestData?: S) { 
    this.logger.log(operation + ' ' + this.url); 
    if (requestData) { 
     this.logger.log('SENT'); 
     this.logger.log(requestData); 
    } 
    this.logger.log('RECEIVED'); 
    this.logger.log(responseData); 
    return responseData; 
} 

Nhưng tôi không nghĩ rằng bạn thực sự cần nó, bởi vì bạn không cần phải viết this.logData<T, any>('GET', data) thay vì chỉ viết this.logData('GET', data). Loại T sẽ được infered

20

Kể từ TypeScript 2.3, bạn có thể sử dụng generic parameter defaults.

private logData<T, S = {}>(operation: string, responseData: T, requestData?: S) { 
    // your implementation here 
} 
+0

Mặc dù không cần thiết vì suy luận nên hoạt động, +1 để sử dụng tính năng mới của ngôn ngữ này. – FstTesla

+0

Tò mò nếu sử dụng 'S = never' sẽ thực thi kiểu được chỉ định khi tham số tùy chọn được sử dụng. – cchamberlain

+0

'S = bất kỳ' sẽ cho phép bất kỳ loại nào –

Các vấn đề liên quan