参数不能分配给T类型的参数

时间:2017-06-23 00:21:52

标签: typescript typescript2.0

我已经按如下方式定义了接口IDictionary

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

然后我将此类 T 传递给db.update()函数,该函数定义为:

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

当我尝试编译此文件时,我收到错误:

  

src / shared / Model.ts(64,7):类型&#39; {lastUpdated:string; }&#39;不能分配给&#39; T&#39;类型的参数。 (2345)

考虑到IDictionary<any>类型是默认类型&#34; T&#34;,我无法理解为什么这不会被视为有效。我有什么不对的吗?

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

1 个答案:

答案 0 :(得分:1)

Model班级声明中

abstract class Model<T = IDictionary> { 

T是泛型类型参数,可以是任何东西。 IDictionary是默认值,并不意味着T始终与IDictionary兼容。没有什么可以阻止某人使用您的Model

let myModel: Model<string> = ...

Typescript告诉你,在一般情况下,你为db.update的第二个参数构造的值与T不兼容。

使其编译的最简单方法是更改​​db.update这样的调用

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

但是我不知道你想通过使用泛型参数T来实现什么,所以这可能不是正确的解决方案。