2017-07-11 57 views
1

說我有如下定義:如何判斷typescript從參數對象中獲取泛型類型?

interface Options<T = any, K = void> { 
    scope?: K, 
    success: (this: K, result: T) => any, 
    failure: (this: K, result: T) => any 
} 

interface HttpClient { 
    request<T>(opts: Options<T>) 
} 

從上面的定義,打字稿不會給我正確的類型,這在success & failure。我如何告訴Typescript K應該是scope屬性的第一個參數。

實例:

class Abc { 
    //... 

    save() { 
    var client = new HttpClient() 
    client.request({ 
     scope: this, 
     success: function(result) { 
     this // here no intellisense 
     } 
    }) 
    } 

    notify(event, data) { 
    this.element.dispatchEvent(new CustomEvent(event, { detail: data })); 
    } 
} 
+0

您是否已經嘗試使用[箭頭函數](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions):'success:(result)=> {this.notify ....}'? –

+0

這是關於在JavasSript中鍵入intellisense,在Typescript的幫助下,所以您的解決方案不能解決問題。感謝您的幫助。 – bigopon

回答

1

當聲明request<T>(opts: Options<T>)你是固定使用其默認值void類型K。如果你想保留這個類型變量作爲變量,它必須仍然是request<T,K>中的一個類型參數。

此代碼正確推斷的this作爲this類型:

interface Options<T = any, K = void> { 
    scope?: K, 
    success: (this: K, result: T) => any, 
    failure?: (this: K, result: T) => any 
} 

class HttpClient { 
    request<T, K>(opts: Options<T, K>) : any {} 
} 

class Abc { 
    //... 

    save() { 
    var client = new HttpClient() 
    client.request({ 
     scope: this, 
     success: function(result) { 
     this // here intellisense offers `notify` and `save` completion 
     } 
    }) 
    } 

    notify(event, data) { 
    this.element.dispatchEvent(new CustomEvent(event, { detail: data })); 
    } 
} 

其他小的代碼更改:我不得不做出failure可選的HttpClient一類只是爲了得到一些代碼,不抱怨的目的關於比notify()更高的任何東西。

+0

這很有趣。我意識到我不能做太多,因爲我試圖通過很多層來使用它,只是爲了讓智能感知。我給出的例子沒有正確地證明我的用法。感謝您的幫助,但您的答案應該是正確的案件。 – bigopon

相關問題