TypeScript报错:string类型无法赋值给目标对象类型如何解决
问题原因
- 最根本的问题是导入语句写错了:你在
Fonts.ts里导出的常量叫FONT_LIST,但业务文件里写的是import { Fonts } from './Fonts',压根没把自己定义的FONT_LIST导进来,导入的Fonts也完全没用到。你代码里直接用的FONT_LIST是作用域里的其他同名变量,这个变量的类型是带family/style/postscriptName三个字段的对象,和你自己写的字体配置结构完全没关系,三层取值的时候自然会报类型不匹配。 - 就算把导入改对,你现在写的类型全用
string当索引签名,传个不存在的字体名、字重进去TS也识别不出来,留着类型隐患。
修复方案
- 先修正导入语句,删掉没用的
Fonts导入,把自己定义的FONT_LIST正确引入:
改完这步你写死路径的测试代码// 错误写法:import { Fonts } from './Fonts' import { FONT_LIST } from './Fonts'FONT_LIST['Arial']['Bold']['full']就不会再报类型错误,TS能正确识别到最后一层取值是string类型。 - (推荐优化)把
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] - 给业务函数的入参加上类型限制,避免传入非法值,最终业务代码如下:
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
相关产品推荐
相关产品推荐

