【问题标题】:Make some properties optional in a TypeScript type在 TypeScript 类型中使一些属性可选
【发布时间】:2021-08-27 20:30:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您可以使用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: ""
    }
    

    【讨论】:

    • 为了完整性:type RequiredExceptFor&lt;T, TOptional extends keyof T&gt; = Pick&lt;T, Diff&lt;keyof T, TOptional&gt;&gt; &amp; Partial&lt;T&gt;;type Diff&lt;T, U&gt; = T extends U ? never : T;
    • 这里有一个问题。如果源属性是可选的,比如 prop1 和 prop2,则不会触发任何错误。将 Picking 包裹在 Required 中就可以完成这项工作。 type OptionalExceptFor&lt;T, TRequired extends keyof T&gt; = Partial&lt;T&gt; &amp; Required&lt;Pick&lt;T, TRequired&gt;&gt;;
    【解决方案2】:

    为了tetter性能,除了Titian的回答,你必须这样做:

    type OptionalExceptFor<T, TRequired extends keyof T = keyof T> = Partial<
      Pick<T, Exclude<keyof T, TRequired>>
    > &
      Required<Pick<T, TRequired>>;
    

    【讨论】:

      【解决方案3】:
      type onlyOneRequired = Partial<Tag> & {id: string}
      

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

      【讨论】:

        猜你喜欢
        • 2021-02-11
        • 2021-01-18
        • 2022-10-31
        • 2021-08-28
        • 2021-07-06
        • 2023-01-08
        • 2020-09-14
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多