TypeScript使用变量赋值字面量联合类型时出现类型不兼容报错
问题解决:TypeScript中间变量赋值字面量联合类型报错
问题场景
我使用自动生成的类型定义(无法修改该文件):
type MyType = { status: "ACTIVE" | "INACTIVE" }
直接赋值给变量时完全正常:
const myObj1: MyType = { status: "ACTIVE" }
但通过中间变量中转赋值时,会出现类型不兼容报错:
const data = { status: "ACTIVE" } const myObj2: MyType = data
报错信息:
Type '{ status: string; }' is not assignable to type 'MyType'. Types of property 'status' are incompatible. Type 'string' is not assignable to type '"ACTIVE" | "INACTIVE"'.
原因分析
TypeScript对直接写的对象字面量会触发字面量类型推断,所以{status: "ACTIVE"}里的status会被推断为具体的"ACTIVE"字面量类型,完美匹配MyType的联合类型要求。
但中间变量data的status会被TS默认推断为宽泛的string类型——因为TS默认认为变量的值后续可能被修改,不会保留字面量的具体类型,导致和MyType的"ACTIVE" | "INACTIVE"联合类型不兼容。
可行解决方案(无需修改生成的类型文件)
方案1:使用const断言保留字面量类型
用as const强制TS将对象属性推断为不可变的字面量类型,这样status的类型就会被锁定为"ACTIVE",而非宽泛的string:
const data = { status: "ACTIVE" } as const; const myObj2: MyType = data;
这种方式无需手动指定具体的枚举值,适合属性较多的场景。
方案2:给中间变量显式指定MyType类型
直接给data标注MyType类型,让TS在赋值时就完成类型校验:
const data: MyType = { status: "ACTIVE" }; const myObj2: MyType = data;
方案3:局部类型断言
如果只想针对单个属性做类型约束,可以单独给status断言为对应字面量类型:
const data = { status: "ACTIVE" as "ACTIVE" }; const myObj2: MyType = data;
或者直接对整个对象断言为MyType:
const data = { status: "ACTIVE" } as MyType; const myObj2: MyType = data;
内容的提问来源于stack exchange,提问作者György Réti
相关产品推荐
相关产品推荐

