我已经按如下方式定义了接口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;,我无法理解为什么这不会被视为有效。我有什么不对的吗?
演示错误的完整示例:
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 :(得分: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
来实现什么,所以这可能不是正确的解决方案。