如果我有一个具有所有必需属性的类型,那么如何定义具有相同属性的另一种类型,而其中某些属性仍然是必需的,而其余属性是可选的?
例如,我想要一个从SomeType派生的新类型,其中prop1和prop2是必需的,其余的是可选的:
interface SomeType {
prop1;
prop2;
prop3;
...
propn;
}
interface NewType {
prop1;
prop2;
prop3?;
...
propn?;
}
答案 0 :(得分:10)
您可以结合使用Partial
和Pick
来使所有属性部分化,然后仅选择一些必需的属性:
interface SomeType {
prop1: string;
prop2: string;
prop3: string;
propn: string;
}
type OptionalExceptFor<T, TRequired extends keyof T> = Partial<T> & Pick<T, TRequired>
type NewType = OptionalExceptFor<SomeType, 'prop1' | 'prop2'>
let o : NewType = {
prop1: "",
prop2: ""
}
答案 1 :(得分:0)
要获得更好的表现,除了Titian的答案外,您还必须执行以下操作:
type OptionalExceptFor<T, TRequired extends keyof T = keyof T> = Partial<
Pick<T, Exclude<keyof T, TRequired>>
> &
Required<Pick<T, TRequired>>;