我想在接口的嵌套属性中更改类型。
我尝试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; }'.
答案 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"
}
};
如果A
具有其他属性,您还可以扩展A
的版本并省略field
以便保留其他属性:
interface B extends Omit<A, "field"> {
field: Omit<A["field"], "a"> & { a: number };
}