打字稿:如何键入休息对象解构

jos*_*unt 8 destructuring typescript

如果我有这两个对象

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

interface Data {
    one?: string;
    a?: string;
    b?: string;
    c?: string
}
Run Code Online (Sandbox Code Playgroud)

目前我必须做类似的事情

const { one, two, ...restOfData } = input;
const data: Data = {...restOfData};
Run Code Online (Sandbox Code Playgroud)

可以...restOfData直接打字吗?

我希望能够做到这一点

const { one, two, ...data } = input;
data.one = 'test' + one;
data.a = one;
Run Code Online (Sandbox Code Playgroud)

art*_*tem 8

您可以将解构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;
Run Code Online (Sandbox Code Playgroud)

如果你想让一些属性保留在data对象中,我想不出比做两次解构更好的事情了,一个没有“休息”对象,第二个有它。如果您想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;
Run Code Online (Sandbox Code Playgroud)

如果你想所有属性保持,你可以有data作为的浅拷贝input这样的

const { one, two } = input;
const { ...data }: Input & Data = input;
Run Code Online (Sandbox Code Playgroud)