错误TS2678类型“'String'”与角度5中的类型“””不具有可比性

时间:2019-03-06 08:36:35

标签: javascript typescript switch-statement angular5

这是我在角度5中的代码:

gotToWallet(wallet) {

  const { countryId = '', currencyType = '' } = wallet || {};

  let walletIdentity;

  switch (currencyType) {
    case 'CRYPTO':
      walletIdentity = 'userWalletIdentity';
     break;
    case 'FIAT':
      walletIdentity = 'fiatWalletIdentity';
     break;
    case 'ERC20TOKEN':
      walletIdentity = 'xbxUserWalletIdentity';
     break;
 }

  const { currencyId = '' } = (wallet || {})[walletIdentity] || {};
  this.router.navigate([`walletMgmt/wallet-details/${currencyId}/${countryId}`]);

}

运行ng build命令时出现以下错误:

ERROR in src/app/wallet-management/wallets/wallets.component.ts(202,12): error TS2678: Type '"CRYPTO"' is not comparable to type '""'.
src/app/wallet-management/wallets/wallets.component.ts(205,12): error TS2678: Type '"FIAT"' is not comparable to type '""'.
src/app/wallet-management/wallets/wallets.component.ts(208,12): error TS2678: Type '"ERC20TOKEN"' is not comparable to type '""'.

为什么会出现此错误?当我运行ng serve时,代码似乎工作正常。 仅在尝试进行构建时才出现此错误。

谢谢,我们将不胜感激。

3 个答案:

答案 0 :(得分:3)

switch (currencyType as any) {

由于某种原因(可能是打字稿版本?),当您从钱包中销毁currencyType: ''时,编译器将其解释为类型“””而不是字符串。因此,将其投射成任意花样

答案 1 :(得分:1)

@QiaosenHuang提出的答案是可行的,但是就TypeScript而言,这不是一个好习惯,因为它放弃了TypeType的主要目标,即类型安全性。正确的方法是例如使用接口传入类型为wallet

interface IWallet {
  countryId: string;
  currencyType: string;
  // any other properties ...
}

function gotToWallet(wallet?: IWallet) {
  // your code from the question ...
}

我注意到您测试了wallet || {},因此这就是对函数参数使用null coalescing operator的原因。但是当walletundefined时,您的代码实际上什么也不做。因此,更好的解决方案是要求wallet是接口的真实实例(没有?)并将undefined检查移到该函数之外。

答案 2 :(得分:0)

我只是遇到了同样的错误,原来是由webpack的循环导入依赖项触发的。