You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript枚举使用报错:SHA1无法匹配SHA256|SHA512联合类型

问题分析:TypeScript枚举类型不匹配错误

代码背景

定义的枚举:

export enum AlgorithmEnum {
    SHA1,
    SHA256,
    SHA512
}

Authenticator类中使用该枚举:

export class Authenticator {
    Type: Type = Type.TOTP;
    Icon: string = '';
    Issuer: string = '';
    Username: string = '';
    Secret: string = '';
    Pin: null = null;
    Algorithm: AlgorithmEnum = AlgorithmEnum.SHA1;
    Digits: number = 6;
    Period: number = 30;
    Counter: number = 0;
    CopyCount: number = 0;
    Ranking: number = 0;

    constructor() {

    }
}

组件中的exportUriList方法:

exportUriList() {
    const authData = this.authDataService.authData;
    let uriList: string[] = [];

    authData.Authenticators.forEach(auth => {
      //otpauth://totp/IBM%20Security%20Verify:@USER_NAME@?secret=@SECRET_KEY@&issuer=IBM%20Security%20Verify&algorithm=@ALGORITHM@

      let issuerAndUsername = `${auth.Issuer}:${auth.Username}`;
      let secret = `?secret=${auth.Secret}`;
      let issuer = `&issuer=${auth.Issuer}`;
      let algorithm = '';

      if (auth.Algorithm) {

        switch (auth.Algorithm) {
          case AlgorithmEnum.SHA1:
            break;
          case AlgorithmEnum.SHA256:
            break;
          case AlgorithmEnum.SHA512:
            break;
        }

        algorithm = `&algorithm=${auth.Algorithm}`;
      }

      let uri = 'otpauth://totp/';

    });
}

错误信息

错误截图:
错误截图

错误提示:

Type 'AlgorithmEnum.SHA1' is not comparable to type 'AlgorithmEnum.SHA256 | AlgorithmEnum.SHA512'.

原因解析

问题出在if (auth.Algorithm)这个判断上:

  • TypeScript中数字枚举的默认值从0开始递增,所以AlgorithmEnum.SHA1的值是0,SHA256是1,SHA512是2。
  • 在布尔判断逻辑里,0会被视为false,1和2会被视为true。
  • TypeScript类型检查器据此推断:进入if代码块的auth.Algorithm只能是SHA256或SHA512(SHA1的0会让if条件不成立,直接跳过代码块)。
  • 但你的switch语句里写了case AlgorithmEnum.SHA1,这就产生了类型冲突——TypeScript认为这个case永远不会被触发,当前上下文的auth.Algorithm不可能是SHA1,因此抛出错误。

另外补充:Authenticator类中Algorithm属性的默认值是SHA1,且类型明确为AlgorithmEnum,意味着该属性永远不会是null/undefined,所以这个if判断本身就是多余的。

解决方法

方法1:移除多余的if判断

直接删掉if (auth.Algorithm)的包裹,因为Algorithm属性始终是有效的枚举值,无需额外判断:

let algorithm = '';

switch (auth.Algorithm) {
  case AlgorithmEnum.SHA1:
    break;
  case AlgorithmEnum.SHA256:
    break;
  case AlgorithmEnum.SHA512:
    break;
}

algorithm = `&algorithm=${auth.Algorithm}`;

方法2:修正判断逻辑(若确实需要判断)

如果要确保Algorithm是枚举的有效值,可以改为检查是否属于枚举范围:

if (Object.values(AlgorithmEnum).includes(auth.Algorithm)) {
  // switch逻辑保持不变
}

或者明确判断是否为undefined(Algorithm属性不可能为null,类型定义已指定默认值):

if (auth.Algorithm !== undefined) {
  // switch逻辑保持不变
}

内容的提问来源于stack exchange,提问作者Ap0st0l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:42:44