TypeScript中如何指定内联对象的类型?
TypeScript 派生接口内联初始化数组的问题解决
TypeScript报错的核心原因是额外属性检查机制:当你直接把内联对象赋值给Base[]类型的数组时,编译器会严格校验对象是否完全符合Base的结构,不允许出现接口定义外的属性;但如果先把对象声明为A或B类型再push到数组,因为派生类型是Base的子类型,符合类型兼容规则,且不会触发额外属性检查。
你完全可以直接内联初始化数组,不需要单独声明后push,以下是几种可行的解决方式:
- 类型断言:明确告诉编译器内联对象属于对应的派生类型
interface Base { id: number } interface A extends Base { name: string } interface B extends Base { age: number } const items: Base[] = [ { id: 1, name: 'foo' } as A, { id: 2, age: 20 } as B ];
- 指定数组为派生类型联合:如果数组只会包含
A和B的实例,直接把数组类型声明为(A | B)[],内联初始化不会报错,后续也能赋值给Base[]类型
interface Base { id: number } interface A extends Base { name: string } interface B extends Base { age: number } const items: (A | B)[] = [ { id: 1, name: 'foo' }, { id: 2, age: 20 } ]; // 如需赋值给Base[]类型变量 const baseItems: Base[] = items;
- 类型拓宽断言:把内联对象断言为
Base与任意属性的交叉类型(不推荐频繁使用,会降低类型严谨性)
interface Base { id: number } interface A extends Base { name: string } interface B extends Base { age: number } const items: Base[] = [ { id: 1, name: 'foo' } as Base & Record<string, any>, { id: 2, age: 20 } as Base & Record<string, any> ];
内容的提问来源于stack exchange,提问作者Master_T
相关产品推荐
相关产品推荐

