首页 > 解决方案 > TypeScript 类型保护和“仅指一种类型,但在这里用作值”。

问题描述

我正在使用 Typescript 3.2.2 并且无法实现类型保护的最基本实现:

interface Bird {
    fly(): boolean;
}

interface Fish {
    swim(): boolean;
}

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

Error:(50, 11) TS2693: 'Fish' only refers to a type, but is being used as a value here.在 WebStorm 和SyntaxError: /Users/sea-kent/git/docket-management/webapp/src/App.tsx: Unexpected token (51:8)yarn. 启用此语法是否需要配置?

标签: typescript

解决方案


通过检查属性的存在来进行模式匹配的推荐方法是in操作符:

interface Bird {
    fly(): boolean;
}

interface Fish {
    swim(): boolean;
}

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

通过使用in运算符,您可以避免断言。


推荐阅读