【问题标题】:Typescript Union type & Not assignable error打字稿联合类型和不可分配的错误
【发布时间】: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


【解决方案1】:

这个怎么样....

interface INamedNode extends Node {
  value: string;
  equals(term: Term): boolean;
}
interface ILiteral {
  value: string;
  language: string;
  equals(term: Term): boolean;
}

type Term = INamedNode | ILiteral;

abstract class BaseNode extends HTMLElement {
  constructor(public value = '') {
    super();
  }

  equals(term: Term): boolean {
    return term === this;
  }
}

class NamedNode extends BaseNode implements INamedNode {
  constructor(value = '') {
    super(value);
  }

  nodeAsParameter(value: BaseNode) {
    return this.equals(value);
  }
}

我们也可以很好地单独使用Node,而无需定义单独的BaseNode

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2021-06-17
    • 2018-08-01
    • 2022-06-15
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多