如何合并 "Omit" 和 "Pick"?

How do I combine "Omit" and "Pick"?

我想在嵌套的 属性 中更改界面中的类型。

我已经尝试 Omit<Pick<A, "field">, "a"> 并使用交集类型 &

interface A {
    field: {
        a: string; // I want to change this to 'number'
        b: string;
    };
}

interface B {
    field: Omit<Pick<A, "field">, "a"> & { a: number };
}

let c: B = {
    field: {
        a: 1,
        b: "B"
    }
};

上面的代码给我一个错误,上面写着

Type '{ a: number; b: string; }' is not assignable to type 'Pick<Pick<A, "field">, "field"> & { a: number; }'.
  Object literal may only specify known properties, and 'b' does not exist in type 'Pick<Pick<A, "field">, "field"> & { a: number; }'.

Pick 返回仅包含选取的属性的对象类型。所以 Pick<A, 'field'> 将是 { field: { a: string; b: string; } }。您想要 field 的类型,您可以使用索引类型查询 A[field](这将是 { a: string; b: string; }):

interface A {
    field: {
        a: string; // I want to change this to 'number'
        b: string;
    };
}

interface B {
    field: Omit<A["field"], "a"> & { a: number };
}

let c: B = {
    field: {
        a: 1,
        b: "B"
    }
};

Play

如果 A 有其他属性,您还可以扩展 A 的版本,省略 field 以保留其他属性:

interface B extends Omit<A, "field"> {
    field: Omit<A["field"], "a"> & { a: number };
}