代码之家  ›  专栏  ›  技术社区  ›  Joon

类似于在typescript中的object rest?类似于部分<t>

  •  1
  • Joon  · 技术社区  · 6 年前

    下面是一个简单的示例代码:

    interface Params {
      a: string
      b: number
      c: boolean
    }
    
    const f1 = (p1: Params) => void;
    
    const f2 = (p2: Params2) => f1({a: 'default', ...p2});
    

    f2 填充 Params.a 使用默认值。因此, Params2 Params 具有 a?: string ( a 是可选的)。

    如何创建此 参数2 无需手动列表 , b , c ?

    我试过以下方法,但不起作用:

    interface Params2 extends Params {
      a?: string
    }
    

    使用 Partial<T> 不是很好,因为它使所有属性都是可选的,而不是使 可选。

    1 回复  |  直到 6 年前
        1
  •  3
  •   jcalz    6 年前

    使用 conditional types (特别是 Exclude ) mapped types (特别是 Pick Partial )可以表示采用现有类型并有选择地将其某些属性转换为可选属性的想法:

    type Optionalize<T, K extends keyof T> = 
      Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>
    

    基本上就是这样 Optionalize<T, K> 当你取出带有键的属性 K 并使它们成为可选的,保留所有其他属性。

    interface Params2 extends Optionalize<Params, 'a'> {}
    

    你可以验证一下 Params2 等于

    {a?: string, b: number, c: boolean}
    

    根据需要。


    另一个想法:你的 Params 实际上比 参数2 所以当你不能 参数2 通过扩展 帕拉姆 可以 反向操作:

    interface Params2 {
      a?: string
      b: number
      c: boolean
    }
    interface Params extends Params2 {
      a: string
    }
    

    这可能对您有用,也可能不适用,但它可能比执行 Optionalize 在上面打杂耍。


    希望有帮助;祝你好运!