当前位置: 首页 > 知识库问答 >
问题:

如何在TypeScript中实现带有条件类型的接口

尚声
2023-03-14

在一个个人项目中,我遇到了一个TypeScript条件类型的问题。我对TypeScript文档中的条件类型有基本的了解。我希望下面的设置工作,但它给出了一个类型错误。

基本上,我试图为从磁盘加载的树节点定义一个接口。这意味着,由于缺少文件等原因,某些节点可能无法正确加载。因此,任何节点实现都可能包含内容错误

interface Content {
  data: number;
}

interface Error {
  code: string;
}

export interface TreeNode<T extends Content | Error> {
  getValue(): T extends Content ? number : string;
}

class ValueNode<ValueType extends Content> implements TreeNode<ValueType> {
  private readonly value: number;
  public constructor(value: number) {
    this.value = value;
  }
 
  public getValue(): number {
    return this.value;
  }
}

我希望getValue方法的实现可以返回string,因为接口是通过类型扩展内容实现的。但我得到了这种类型的错误:

  • 属性getValue类型ValueNode

克利里,我做得不对。实现我的目标的正确方法是什么?


共有1个答案

羊毅庵
2023-03-14

正如@Dai所指出的,最好不要隐藏内置的错误类型(这样您就可以在模块中使用它)。以下是@Aleksey L.的建议:

TS游乐场链接

interface ContentValue {
  data: number;
}

interface ErrorValue {
  code: string;
}

export interface TreeNode<T extends ContentValue | ErrorValue> {
  getValue(): T extends ContentValue ? number : string;
}

class ValueNode implements TreeNode<ContentValue> {
  public constructor(private readonly value: number) {}
 
  public getValue(): number {
    return this.value;
  }
}
 类似资料:
  • 假设我想写一个函数,它可以接受一个参数,这个参数可以是null类型,也可以是非null类型。如果参数不可为null,则返回类型也应不可为null。类似地,如果参数是可空类型,那么返回类型也应该是可空类型。 以下是我为实现这一职能所做的尝试: 函数签名似乎是正确的,因为它在调用站点上实现了所需的行为,例如: 即返回类型确实由参数类型以正确的方式确定。 然而,我的问题在于函数的实现。如果不将返回值强制

  • 本节介绍 TypeScript 高级类型中的条件类型(conditional type),条件类型就是在初始状态并不直接确定具体类型,而是通过一定的类型运算得到最终的变量类型。 1. 慕课解释 条件类型用来表达非均匀类型映射,可以根据一个条件表达式来进行类型检测,从两个类型中选出其中一个: T extends U ? X : Y 语义类似三目运算符:若 T 是 U 的子类型,则类型为 X,否则类

  • 我使用的库定义了以下类型: 库公开了一个返回上述类型的函数: 我想将此函数用于有差别的联合: 但是TypeScript(3.4.1)给了我这个错误信息: 类型“add”不可分配给类型“add” 预期的类型来自属性'type',该属性在这里声明为类型{type:“add”;n:number;} 我不明白为什么会这样-似乎总和(并集)类型被解释为“乘积”类型。 如果将类型定义更改为: ... Type

  • a、b默认都可选,但当a有值时,让b成为必填项。 应该如何实现?

  • 问题内容: 我在编写的程序中遇到接口问题。我想创建一个接口,该接口的方法之一可以接收/返回对自己对象类型的引用。就像这样: 我不能在“?”处使用“ I”,因为我不想返回对接口的引用,而是要返回对类的引用。我搜索后发现在Java中没有“自我引用”的方法,因此我不能仅用“?”代替。在示例中,“ self”关键字或类似的内容。实际上,我想出了一个解决方案 但这似乎确实是一种解决方法或类似方法。还有另一种

  • 我有一个泛型类型,它将是事件系统中事件的基类。我们希望这些是单例,但它也是泛型的,以便子类可以在事件触发时指定它们在回调中期望的参数的类型。 我拥有的东西看起来像这样: 这里有些东西我认为很奇怪,主要是因为打字稿的语言要求。GetInstance的参数似乎是必要的,因为< code>var x = new TEvent()似乎不被TypeScript允许。空接口有助于加强什么可以被接受为泛型类型。