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

TypeScript如何为剩余对象解构直接指定类型?

直接为剩余解构对象指定TypeScript类型的可行方案

你好呀!针对你想在解构input时直接给剩余的data指定Data类型的需求,TypeScript本身不支持直接在剩余解构变量后加类型标注(比如...data: Data这种写法会触发语法错误),不过我们有几种简洁且实用的方式来实现你的目标:

1. 解构后立即做类型断言

这是最直接的实现方式,先解构出one、two和原始剩余对象,再把剩余对象断言为Data类型:

interface Input { one?: string; two?: string; c?: string }
interface Data { one?: string; a?: string; b?: string; c?: string }

const input: Input = { one: "hi", two: "there", c: "demo" };

const { one, two, ...rawData } = input;
const data = rawData as Data; // 直接断言为目标Data类型

data.one = 'test' + one;
data.a = one;

2. 解构前扩展input的类型(更优雅的断言方式)

如果你想在解构环节一步到位,可以把input断言为Input和Partial<Data>的交集类型,让TS自动推断剩余部分的类型更贴近Data:

const { one, two, ...data } = input as Input & Partial<Data>;

data.one = 'test' + one;
data.a = one;

这里用Partial<Data>是因为Data里的a、b属性在原始input中不存在,交集类型能让TS认可后续对这些属性的赋值操作。

3. 用转换函数避免类型断言(更安全)

如果你不想用类型断言(毕竟断言是“强制”TS认可类型,存在一定风险),可以写个小函数来处理类型转换,让类型推导更严谨:

// 定义转换函数,返回Data中去掉a、one的部分(对应input去掉two后的结构)
function extractBaseData(input: Input): Omit<Data, 'a' | 'one'> {
  const { two, ...rest } = input;
  return rest;
}

const input: Input = { one: "hi", two: "there", c: "demo" };
const one = input.one;
const data: Data = { ...extractBaseData(input) };

data.one = 'test' + one;
data.a = one;

补充说明:为什么不能直接写...data: Data?

TypeScript的解构语法规则里,剩余变量的类型是自动推断的(原对象类型减去被解构的属性),不支持直接在剩余变量后添加类型标注,所以必须通过上述方式手动指定目标类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:03:58