【发布时间】:2022-01-28 15:29:31
【问题描述】:
我不确定为什么这不起作用。如果 Term 既可以是 Node 也可以是 Literal,并且我提供了一个 Node.为什么这里不接受这个术语?我怎样才能最好地解决这个问题?
注意接口和联合类型来自不同的库,所以我只能更改NamedNode类定义
点击here在打字稿操场上查看此代码
interface INamedNode {
value: string;
equals(term:Term):boolean;
}
interface ILiteral {
value: string;
language: string;
equals(term:Term):boolean;
}
type Term = INamedNode | ILiteral;
abstract class BaseNode
{
constructor(public value=''){}
}
class NamedNode extends BaseNode implements INamedNode {
constructor(value=''){
super(value);
}
equals(term:Term):boolean {
return term === this;
}
nodeAsParameter(value: BaseNode){
return this.equals(value);
}
}
当前错误
“BaseNode”类型的参数不能分配给“Term”类型的参数。 “BaseNode”类型缺少“ILiteral”类型的以下属性:值、语言、等于
【问题讨论】:
-
问题实际上是我们在调用
equals(term: Term): boolean;,但是传递了一个类型Node。我们应该将Term(至少)类型的值传递给它。 -
@NalinRanjan 但这会渗透到其他方法,然后我的整个代码变得充满了更通用的
Term,而不是更具体的Node
标签: typescript compiler-errors union-types