2017-06-23 68 views
0

我已定義的接口IDictionary作爲類型T的參數如下:參數不能分配給

interface IDictionary<T = any> { 
    [key: string]: T; 
} 

再後來我通過這種類型Ťdb.update()函數被定義爲:

public update<T = IDictionary>(path: string, value: T) { 
    return this.ref(path).update(value); 
} 

當我嘗試編譯此文件時,出現如下錯誤:

src/shared/Model.ts (64,7): Argument of type '{ lastUpdated: string; }' is not assignable to parameter of type 'T'. (2345)

考慮到IDictionary<any>類型是默認的「T」,我不明白爲什麼這不會被認爲是有效的。有什麼我做錯了嗎?

演示錯誤

enter image description here

完整的例子:

interface IDictionary<T = any> { 
    [key: string]: T; 
} 

function dbupdate<T = IDictionary>(path: string, value: T) { 
    return this.ref(path).update(value); 
} 

abstract class Model<T = IDictionary> { 

    public update(updateWith: IDictionary) { 

     const reference = 'bar'; 
     return dbupdate<T>(
      reference, 
      { 
       ...updateWith, 
       ...{ lastUpdated: 'baz' } 
      } 
     ); 
    } 
} 
+0

問題不在於您發佈的代碼中,而是您如何使用它。附加的圖像不顯示所有相關的代碼,只顯示其結尾。這是什麼'T'? –

+0

在上面的圖片中,您可以在懸停對話框中看到類型分辨率...默認爲「IDictionary ' – ken

+0

請使用其他相關代碼更新您的問題。如果有其他人可以用來重現問題的東西,那就太好了。 –

回答

1

在你Model類聲明

abstract class Model<T = IDictionary> { 

T是泛型類型參數,可以是任何東西。 IDictionary是默認值,但並不意味着T將始終與IDictionary兼容。沒有什麼能阻止別人使用你的Model這樣的:

let myModel: Model<string> = ... 

打字稿告訴你,在一般情況下,你的db.update第二個參數構建的價值不能與T.

以最簡單的方式兼容使編譯是改變db.update呼叫這樣

return dbupdate<IDictionary>(
     reference, 
     { 
      ...updateWith, 
      ...{ lastUpdated: 'baz' } 
     } 
    ); 

不過,我不知道你正在試圖通過其泛型參數T達到什麼樣的,所以可能這不是正確的解決方案。

+0

模型是其他模型繼承的基類因此將指示給定具體子類的接口定義。我認爲有一種方法可以在更新期間保持類型特異性,並且在其他地方進行類型轉換。所以在某種程度上,我已經解決了我在其他地方的問題,但對於這個問題的意圖,我覺得你已經解決了它的問題。 – ken

相關問題