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

TypeScript联合类型变量报“赋值前使用”错误如何解决

报错原因

TypeScript控制流分析检测到:style变量的所有赋值逻辑都包裹在try块内,一旦try块中字体加载、字体注册等任意步骤抛出异常,代码会进入catch块打印错误后,直接走到return style逻辑,此时style从未被赋值,存在返回undefined的风险,因此抛出Variable 'style' is used before being assigned错误。

另外原代码的返回值类型声明Promise<Object>也存在问题:style的类型是object | string联合类型,方法实际可能返回字符串,和声明的返回类型不匹配,修复时需要同步调整。

修复方案

可根据业务场景选择以下任意一种方案:

  • 方案1:声明变量时设置符合类型要求的初始默认值
    这是改造成本最低的方案,给style设置兜底初始值即可覆盖异常场景的未赋值问题:

    async myFunction(typography: Typography, valueOnly: Boolean): Promise<object | string> {
      // 初始值符合object | string的联合类型要求
      let style: object | string = '';
    
      try {
        const customFontName = `custom-font-${uuid.v1()}`;
        const customFontFace = new FontFace(customFontName, `url(${typography.custom_font})`);
        const loadedFace = await customFontFace.load();
        ((document as any).fonts as any).add(loadedFace);
    
        if (valueOnly) {
          style = customFontName;
        } else {
          style = {
            'font-family': customFontName
          };
        }
      } catch (err) {
        console.log(err);
      }
    
      return style;
    }
    
  • 方案2:在catch分支补全赋值逻辑
    如果需要异常场景返回特定兜底值,可以在catch块中给style赋值,保证所有执行路径下变量都有明确值:

    async myFunction(typography: Typography, valueOnly: Boolean): Promise<object | string> {
      let style: object | string;
    
      try {
        const customFontName = `custom-font-${uuid.v1()}`;
        const customFontFace = new FontFace(customFontName, `url(${typography.custom_font})`);
        const loadedFace = await customFontFace.load();
        ((document as any).fonts as any).add(loadedFace);
    
        style = valueOnly 
          ? customFontName 
          : { 'font-family': customFontName };
      } catch (err) {
        console.log(err);
        // 异常场景赋值兜底
        style = valueOnly ? '' : {};
      }
    
      return style;
    }
    
  • 方案3:调整返回逻辑位置,异常场景提前返回
    如果不需要异常场景执行后续统一返回逻辑,可以把正常流程的return放在try块内,catch块直接返回兜底值:

    async myFunction(typography: Typography, valueOnly: Boolean): Promise<object | string> {
      try {
        const customFontName = `custom-font-${uuid.v1()}`;
        const customFontFace = new FontFace(customFontName, `url(${typography.custom_font})`);
        const loadedFace = await customFontFace.load();
        ((document as any).fonts as any).add(loadedFace);
    
        const style: object | string = valueOnly 
          ? customFontName 
          : { 'font-family': customFontName };
        return style;
      } catch (err) {
        console.log(err);
        // 异常时直接返回兜底值
        return valueOnly ? '' : {};
      }
    }
    

注意:不推荐使用return style!非空断言绕过类型校验,这种方式仅会屏蔽TS的类型提示,不会解决运行时可能返回undefined的问题,容易埋下潜在bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:27:16