如何忽略对象传播中的字段?

时间:2018-12-31 15:21:31

标签: typescript

我有一个界面包含多个字段,而另一个界面则包含几乎所有字段(仅一个)。

如何在TypeScript中使用而没有未分类的不安全拐杖(<>asanyunknown等)可以排除(所以不列举我要复制的每个字段)?

interface A {
    fieldA: number;
    fieldB: string;
    fieldC: number;
    fieldD: string;
    fieldE: number;
    fieldF: string;
}

interface B {
    fieldA: number;
    fieldB: string;
    fieldC: number;
    fieldD: string;
    fieldE: number;
    // no fieldF here
}

const a: A = {
    fieldA: 1,
    fieldB: 'b',
    fieldC: 3,
    fieldD: 'd',
    fieldE: 5,
    fieldF: 'f'
}

const b: B = {
    ...a,
    fieldF: undefined
};

这不会编译,因为fieldF仍然存在,其值仅为undefined

2 个答案:

答案 0 :(得分:1)

如果您不介意中间步骤,则可以执行以下操作:

ActionMailer

这结合了spread and rest operators。编译器似乎对我的机器很满意,它给了我您期望的结果。

注意:这还会创建常量const { fieldF, ...everythingExceptF } = a; const b: B = everythingExceptF; ,您可能想要也可能不需要。如果在同一范围内由于其他原因已经需要该名称,则可以这样重新分配它:

fieldF

答案 1 :(得分:0)

如果您想删除该字段,则可以:

const copy: A = {
    ...a
};

delete copy.fieldF;

const b: B = copy;

但是您不必:

const b: B = {
    ...a
};

编译器可以。