TypeScript:如何为剩余对象解构添加类型

13

如果我有这两个物体

interface Input {
    one?: string;
    two?: string;
    c?: string
}

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

目前我必须做类似于以下的事情

const { one, two, ...restOfData } = input;
const data: Data = {...restOfData};

能否直接输入...restOfData

我希望能够这样做。

const { one, two, ...data } = input;
data.one = 'test' + one;
data.a = one;
1个回答

13

您可以将解构类型定义为Input和一个包含所有来自Data字段但是可选的类型的交集。 对于这个“可选数据”类型,您可以使用内置的Partial类型:

const { one, two, ...data }: Input & Partial<Data> = input; 
// data type is  inferred as data: { c: string; a?: string; b?: string; }
// so you now can
data.a = one;

如果您希望某些属性保留在data对象中,我认为最好的方法是进行两次解构操作,第一次不包含“rest”对象,第二次则包含它。如果您想让one保留在data中,但删除two,可以这样做。
interface Input {
    one?: string;
    two?: string;
    c?: string
}

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

const { one } = input;
const { two, ...data }: Input & Data = input;

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

如果您希望所有属性保持不变,您可以使用以下方式将data作为input的浅拷贝:
const { one, two } = input;
const { ...data }: Input & Data = input;

在这里,既然所有的“Data”字段都是可选的,为什么需要“Partial<T>”呢? - zerkms
@zerkms 抱歉,正在更新问题以使其更准确。 - joshhunt
这个很好用,但是当我需要在两个对象之间共享字段时,似乎不太适用。我会继续深入挖掘,看看是否有解决方法。 - joshhunt
啊,这是因为解构移除了 one,所以 ...data 将不会有一个 one 字段。不确定如何解决这个问题。 - joshhunt
不知道如何在一个解构中完成它,但使用两个解构很容易实现。我已更新答案。 - artem
嗯,在这种情况下,输入仍然会有two字段,但是Data上没有two可用。不过,我认为目前没有更好的方法,所以我会将其标记为正确。谢谢! - joshhunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接