如何结合“省略”和“选择”?

时间:2019-08-16 11:35:32

标签: typescript typescript-generics

我想在接口的嵌套属性中更改类型。

我尝试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; }'.

1 个答案:

答案 0 :(得分:1)

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 };
}