无法将含扩展运算符的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
相关产品推荐
相关产品推荐

