在TypeScript类型中使某些属性为可选

时间:2018-10-08 13:23:00

标签: typescript

如果我有一个具有所有必需属性的类型,那么如何定义具有相同属性的另一种类型,而其中某些属性仍然是必需的,而其余属性是可选的?

例如,我想要一个从SomeType派生的新类型,其中prop1和prop2是必需的,其余的是可选的:

interface SomeType {
    prop1;
    prop2;
    prop3;
    ...
    propn;
}

interface NewType {
    prop1;
    prop2;
    prop3?;
    ...
    propn?;
}

2 个答案:

答案 0 :(得分:10)

您可以结合使用PartialPick来使所有属性部分化,然后仅选择一些必需的属性:

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