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

TypeScript报错:string类型无法赋值给目标对象类型如何解决

问题原因
  • 最根本的问题是导入语句写错了:你在Fonts.ts里导出的常量叫FONT_LIST,但业务文件里写的是import { Fonts } from './Fonts',压根没把自己定义的FONT_LIST导进来,导入的Fonts也完全没用到。你代码里直接用的FONT_LIST是作用域里的其他同名变量,这个变量的类型是带family/style/postscriptName三个字段的对象,和你自己写的字体配置结构完全没关系,三层取值的时候自然会报类型不匹配。
  • 就算把导入改对,你现在写的类型全用string当索引签名,传个不存在的字体名、字重进去TS也识别不出来,留着类型隐患。
修复方案
  1. 先修正导入语句,删掉没用的Fonts导入,把自己定义的FONT_LIST正确引入:
    // 错误写法:import { Fonts } from './Fonts'
    import { FONT_LIST } from './Fonts'
    
    改完这步你写死路径的测试代码FONT_LIST['Arial']['Bold']['full']就不会再报类型错误,TS能正确识别到最后一层取值是string类型。
  2. (推荐优化)把Fonts.ts的类型定义改成as const写法,让TS自动推导出精确的字面量类型,不用写冗余的interface,还能自动校验传入的key是否合法:
    // Fonts.ts 优化后
    export const FONT_LIST = {
      'Arial': {
        'Regular': {
          'full': 'blahblah',
          'trial': 'blahblah'
        },
        'Bold': {
          'full': 'blahblah',
          'trial': 'blahblah'
        },
      },
    } as const
    
    // 导出联合类型给函数入参做限制
    export type FontPostscriptName = keyof typeof FONT_LIST
    export type FontStyle = keyof typeof FONT_LIST[FontPostscriptName]
    export type EntitlementType = keyof typeof FONT_LIST[FontPostscriptName][FontStyle]
    
  3. 给业务函数的入参加上类型限制,避免传入非法值,最终业务代码如下:
    import { FONT_LIST, FontPostscriptName, FontStyle, EntitlementType } from './Fonts'
    
    function foo(postscriptName: FontPostscriptName, style: FontStyle) {
      const entitlement: EntitlementType = "full";
      const selectedFont = FONT_LIST[postscriptName][style][entitlement];
      return selectedFont;
    }
    

改完之后不管是动态传参还是写死路径取值,TS都能正确推导返回值类型,传入不存在的字体、字重时也会提前抛错拦截问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:45:34