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

无法将含扩展运算符的JavaScript对象转换为TypeScript的问题

解决TypeScript中混合类型数组元素的对象扩展问题

问题根源

你的JavaScript代码能正常运行,但TypeScript报错,核心原因是TypeScript对someData的类型推断为(string | { age: string })[]——它认为someData[1]可能是字符串,也可能是对象。而对象扩展运算符...只能用于对象类型,所以TypeScript会抛出"Property assignment expected"错误。

解决方案

1. 类型断言(快速但需确保类型安全)

直接告诉TypeScriptsomeData[1]是对象类型,适合你明确知道该位置元素一定是对象的场景:

var someData = [
    'Some String',
    {'age': '46'}
];

const addressObject = {
    street: 'Main Street',
    number: '14'
};

const resultObject = {
    address: addressObject,
    ...(someData[1] as { age: string })
};

console.log(resultObject);

如果不确定对象的具体结构,可以用更通用的断言:

...(someData[1] as Record<string, unknown>)

2. 类型守卫(类型安全,推荐)

先检查元素是否为非null的对象,确保只有在符合条件时才执行扩展,避免潜在的运行时错误:

var someData = [
    'Some String',
    {'age': '46'}
];

const addressObject = {
    street: 'Main Street',
    number: '14'
};

const someData_1 = someData[1];
const resultObject = {
    address: addressObject,
    ...(typeof someData_1 === 'object' && someData_1 !== null ? someData_1 : {})
};

console.log(resultObject);

3. 精确指定数组类型(元组,最严谨)

如果数组的元素类型和位置是固定的,直接用元组类型定义someData,让TypeScript明确知道每个位置的元素类型:

// 元组类型:第一个元素是string,第二个是{ age: string }
const someData: [string, { age: string }] = [
    'Some String',
    {'age': '46'}
];

const addressObject = {
    street: 'Main Street',
    number: '14'
};

const resultObject = {
    address: addressObject,
    ...someData[1] // 此时TypeScript明确知道这是对象,不会报错
};

console.log(resultObject);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:38