参数不能分配给
我已定义的接口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”,我不明白为什么这不会被认为是有效的。有什么我做错了吗?
完整的例子:
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' }
}
);
}
}
在你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
达到什么样的,所以可能这不是正确的解决方案。
模型是其他模型继承的基类因此
问题不在于您发布的代码中,而是您如何使用它。附加的图像不显示所有相关的代码,只显示其结尾。这是什么'T'? –
在上面的图片中,您可以在悬停对话框中看到类型分辨率...默认为“IDictionary' –
ken
请使用其他相关代码更新您的问题。如果有其他人可以用来重现问题的东西,那就太好了。 –