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

TypeScript 5+中派生值推入基础数组报错的原因咨询

TypeScript 5+ 中对象字面量属性检查报错的原因解析

我找不到对应的具体破坏性变更记录,想请教:为什么在TypeScript 5+版本中,以下代码会抛出Object literal may only specify known properties错误?

interface Base {
  id: number;
}

interface Derived extends Base {
  name: string;
}

const items: Base[] = [];

let item1: Derived;
let item2: Derived;

item1 = { id: 1, name: 'this is ok regardless' };
items.push(item1);

items.push((item2 = { id: 2, name: 'this is NOT ok in 5.0.4, but is ok in 4.9.5' }));

原因解析

这个问题源于TypeScript 5.0对赋值表达式的类型推断逻辑做了调整:

  • 在TS 4.9及更早版本中,(item2 = {...})这类赋值表达式的类型会直接沿用被赋值变量的类型(也就是Derived),而Derived是Base的子类,结构完全兼容,所以推给Base[]时不会触发属性检查报错。
  • 但TS 5.0之后,赋值表达式的类型推断优先采用右侧对象字面量的精确类型(即{ id: number; name: string; }),不再自动对齐被赋值变量的Derived类型。当这个精确类型的字面量直接作为参数传给期望Base类型的items.push()时,TS的严格对象字面量检查就会触发——因为name不是Base接口定义的已知属性,因此抛出错误。

解决办法

有两种常见的修复方式:

  1. 显式指定右侧字面量的类型,强制对齐Derived:
items.push((item2 = { id: 2, name: 'fixed' } as Derived));
  1. 将赋值和push操作分开,让变量类型先完成推导:
item2 = { id: 2, name: 'fixed' };
items.push(item2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:11:13