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

TypeScript类型保护和"仅指一种类型,但在此处用作值。"

薛滨海
2023-03-14

我使用的是Typescript 3.2。2、无法实现最基本的类型防护:

interface Bird {
    fly(): boolean;
}

interface Fish {
    swim(): boolean;
}

function swimIfYouCan(x: Fish | Bird) {
    if ((<Fish>x).swim) {
        return true
    }
}

这将产生错误:(50,11)TS2693:'鱼'仅指一种类型,但在这里用作值。(51:8)源自yarn。是否需要配置来启用此语法?

共有2个答案

纪辰沛
2023-03-14

对于你的问题,我想到了三种可能的方法。

>

  • 如果你想转换它并直接使用它,你必须使用作为运算符(如@jonrSharpe在注释中提到的),所以例如(x作为鱼)。

    使用操作符中的检查它是否可用,例如if('swim'在x中)

    最后但并非最不重要的一点(我认为这是最好的情况),只需执行一个check实例来检查您得到了什么实例:if(Fish的x实例)

    编辑:没有充分阅读问题,您无法在运行时检查接口。但在接口顶部创建一个类并没有什么害处

  • 司马狐若
    2023-03-14

    通过检查属性的存在来进行模式匹配的推荐方法是中的

    interface Bird {
        fly(): boolean;
    }
    
    interface Fish {
        swim(): boolean;
    }
    
    function move(x: Fish | Bird) {
      if ("swim" in x) {
        return x.swim();
      } else {
        return x.fly();
      }
    }
    

    通过在操作符中使用,可以避免断言。

     类似资料:
    • 本节介绍的类型保护 TypeScript 类型检查机制的第二个部分,我们可以通过 typeof、instanceof、in 和 字面量类型 将代码分割成范围更小的代码块,在这一小块中,变量的类型是确定的。 1. 慕课解释 类型保护是指缩小类型的范围,在一定的块级作用域内由编译器推导其类型,提示并规避不合法的操作。 2. typeof 通过 typeof 运算符判断变量类型,下面看一个之前介绍函数重

    • 我试图为我的AWS Lambda使用Typescript,我在使用promise时遇到了以下错误。 我尝试在代码中使用以下变体 我尝试了I Get中提到的解决方案:[ts]'Promise'只引用类型,但在这里被用作值,但没有运气。

    • 我试图用一种方法扩展Puppeter的类ElementHandle。我已经检查了一些例子,并编写了简单的代码,就像这个答案一样。 但是VSCode显示了我更改ElementHandle prototype所在行的一个错误: “ElementHandle”仅引用类型,但在此处用作值。ts(2693) 我怎么才能修好它? 我的代码: ElementHandle类:https://github.com/

    • 给出了以下错误: 仅引用类型,但在此处用作值。 这是可以理解的,因为它是对象的属性。 如何使用指定类型,如one?

    • 我使用TypeScript,并有一个情况下,一个函数返回两个类型的联合。它可以返回字符串或模型,但我不知道如何获取类型并根据返回的类型执行操作。 我该怎么做这样的事?在本例中,字符串和IMyModel如何用作值(如错误消息所示)?这个错误使我感到困惑。 我在使用的行中得到以下可视化工作室代码中的静态错误: “string”仅引用类型,但在此处用作值。ts(2693) “IMyModel”仅引用类型