在TypeScript类型中使一些属性可选

spb*_*spb 7 typescript

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

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

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

interface NewType {
    prop1;
    prop2;
    prop3?;
    ...
    propn?;
}
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 13

您可以使用组合的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: ""
}
Run Code Online (Sandbox Code Playgroud)

  • 为了完整起见:`Type RequiredExceptFor &lt;T,TOptional扩展了T&gt; = Pick &lt;T,Diff &lt;keyof T,TOptional &gt;&gt;&Partial &lt;T&gt;;`具有`Diff &lt;T,U&gt; = T的类型扩展了U吗?永不:T;` (3认同)

Cha*_*ANI 5

对于 tetter 性能,除了Titian的答案之外,您还必须执行以下操作:

type OptionalExceptFor<T, TRequired extends keyof T = keyof T> = Partial<
  Pick<T, Exclude<keyof T, TRequired>>
> &
  Required<Pick<T, TRequired>>;
Run Code Online (Sandbox Code Playgroud)


M F*_*ajj 5

type onlyOneRequired = Partial<Tag> & {id: string}
Run Code Online (Sandbox Code Playgroud)

在上述类型中,Tag 的所有属性都是可选的,而不是id必需的。因此,您可以使用此方法并指定所需的属性。