TS 2349:尽管基于控制流量的防护装置,为什么需要进行演员表演?

时间:2016-06-16 19:26:51

标签: casting typescript typescript1.8

在Typescript 1.8.9中

鉴于

  type templateUrlFunction = (locale?:string) => string;
  type templateUrlParameter = string | templateUrlFunction;

  private _templateUrl:templateUrlParameter;

为什么我必须转换_templateUrl,即使我正在使用控制流进行类型保护:

let templateUrl:string;
if (typeof this._templateUrl === 'function') {
  templateUrl = (<templateUrlFunction>this._templateUrl)($translate.use());
} else if (typeof this._templateUrl === 'string') {
  templateUrl = <string>this._templateUrl;
}

我见过的类型防护示例不需要施法。如果我不投,我得到错误: 转化为2349 Cannot invoke an expression whose type lacks a call signature.

的行上的<templateUrlFunction>

1 个答案:

答案 0 :(得分:1)

因为类型保护不适用于TS中的属性&lt; 2.0。

一种可能的解决方法是首先将其置于变量中:

<button hidden id="sign-up-float-icon" class="floater mdl-button mdl-js-button mdl-button--icon">
      <i class="material-icons">more_vert</i>
    </button>

    <ul class="mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect" for="sign-up-float-icon">
      <li class="mdl-menu__item" id="sign-up-email">
        Register with Email
      </li>
      <li class="mdl-menu__item" id="sign-in-google">
        Login with Google
      </li>
    </ul>