2

我正在使用 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. 启用此语法是否需要配置?

4

2 回答 2

1

通过检查属性的存在来进行模式匹配的推荐方法是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运算符,您可以避免断言。

于 2019-02-11T16:01:07.397 回答
1

对于您的问题,我想到了三种不同的方法。

  1. 如果你想转换它并直接使用它,你必须使用as运算符(正如@jonrsharpe 在评论中提到的那样),例如(x as Fish).swim

  2. 使用in运算符检查它是否可用,例如if ('swim' in x)

  3. 最后但并非最不重要的(我认为这种情况是最好的情况),只需做一个检查实例来检查你有什么实例:if (x instance of Fish)

编辑:没有很好地阅读问题,您无法在运行时检查接口。但是在接口之上创建一个类并没有什么坏处

于 2019-02-11T16:03:10.053 回答