TypeScript定义字符串联合类型数组时出现不兼容错误
TypeScript类型不兼容错误原因解析
问题代码
interface Foo { videoType: "A" | "B" } interface RS { result: Foo[] } const fn = (): RS => { const col = [{ videoType: 'A', }] return { result: col, } }
错误信息
TS2322: Type '{ videoType: string; }[]' is not assignable to type 'Foo[]'.
Type '{ videoType: string; }' is not assignable to type 'Foo'.
Types of property 'videoType' are incompatible.
Type 'string' is not assignable to type "A" | "B".
错误原因
- TypeScript默认类型推断规则:定义
col时未指定明确类型,TypeScript会将videoType的类型推断为宽泛的string,而非期望的字面量类型"A"。这是因为TypeScript默认会为对象属性推断最宽松的基础类型,允许后续修改属性值为同基础类型的其他值。 - 类型约束不匹配:
RS接口要求result的类型是Foo[],其中Foo的videoType是严格的字面量联合类型"A" | "B"。但col被推断为{videoType: string}[],string类型范围远大于"A" | "B",TypeScript无法保证col中的videoType不会被修改为不符合约束的值(比如"C"),因此抛出类型不兼容错误。
验证方式(可选)
给col添加明确类型注解后错误会消失:
const col: Foo[] = [{ videoType: 'A' }]
内容的提问来源于stack exchange,提问作者yiooxir
相关产品推荐
相关产品推荐

