【问题标题】:Convert object of a partial interface type to the "full" interface type in TypeScript将部分接口类型的对象转换为 TypeScript 中的“完整”接口类型
【发布时间】:2021-10-03 18:50:01
【问题描述】:

假设我有一个界面 A,如下所示:

interface A {
  prop1: string
  prop2: string
}

我像这样初始化对象 obj

const obj: Partial<A> = { prop1: 'xyz' }

有没有办法将 obj 转换为 A 并自动设置任何未在 obj 中定义但在 A 到nullundefined?如果可能,我只想在变量初始化时使用部分,并坚持函数参数中的“完整”类型。

我无法将 A 更改为班级。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这个答案已经很晚了,但我会留下它以防以后有人遇到。

    Typescript 是关于类型的,它在编译时用于检查代码是否正确,但在运行时将其删除以将代码转换为纯 JavaScript。这意味着,无法使用打字稿功能添加任何属性。

    但是,您可以定义一个函数来获取部分对象并设置默认属性:

    function complete(obj: Partial<A>): A {
      return Object.assign({
        prop1: 'default1',
        prop2: 'default2'
      }, obj);
    }
    
    const partial: Partial<A> = { prop1: 'xyz' }
    const a: A = complete(partial)
    console.log(a) // { prop1: 'xyz', prop2: 'default2' }
    

    如果您想将缺少的属性设置为未定义,同样的函数也可以工作,但您将无法将返回的对象强制转换为A,因为A 要求所有属性都是字符串而不是@987654324 @或undefined

    【讨论】:

      【解决方案2】:

      作为 Alex Chashin 不错答案的扩展,这里有一个变体,其目标是验证 Partial&lt;T&gt; 是有效的 T 并安全地转换为它,否则返回 undefined。

      obj 作为 Object.assign (target) 的第一个参数传递,以保持引用完整性。第二个参数进行(无害)合并,并满足结果将是有效的T,这要归功于 if 条件。

          interface A {
            value1: string
            value2: string
          }
          
          function validateObject(obj: Partial<A>): A | undefined {
            if (obj.value1 && obj.value2) {
              // Safe cast Partial<T> to T
              return Object.assign(obj, {
                value1: obj.value1,
                value2: obj.value2,
              });
            }
            return undefined;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 2018-11-28
        • 2021-01-17
        • 2013-01-08
        • 2018-06-20
        • 1970-01-01
        相关资源
        最近更新 更多