2017-06-23 69 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

相关问题