Typescript 基于接口从另一个对象创建一个对象

Posted

技术标签:

【中文标题】Typescript 基于接口从另一个对象创建一个对象【英文标题】:Typescript create an object from another object, based on an interface 【发布时间】:2020-05-02 08:54:40 【问题描述】:

我想从另一个对象创建一个ExampleInterface 对象,但只保留ExampleInterface 包含的那些属性。

是否可以不手动复制每个键?

export interface ExampleInterface 
  property1: string;
  property2: string;

然后

const exampleObject: ExampleInterface = anotherObjectThatHasMoreProperties;

提前谢谢你。

【问题讨论】:

TypeScript 类型不会生成运行时类型,因此开箱即用您无法执行此操作。为什么需要在运行时剥离额外的属性?可能最简单的解决方案是创建一个手动复制所需属性的函数。还有libraries designed to bring runtime type features to TS,他们可能会有所帮助。 How can I create an object based on an interface file definition in TypeScript?的可能重复 【参考方案1】:

一个可能的解决方案是上面的函数:

 function createExampleInterface(sourceObject: ExampleInterface): ExampleInterface 
 
      const emptyExampleInterface: ExampleInterface = 
        property1: '',
        property2: ''
      ;
      const interfaceProperties = Object.keys(emptyExampleInterface);
      const targetObject: ExampleInterface = Object.assign(, sourceObject) ;

      for (let property of Object.keys(targetObject))     
        if (interfaceProperties.indexOf(property) < 0)       
          delete targetObject[property];
        
      
      return targetObject;
 

函数使用示例:

const objA = 
  property1: 'Property 1',
  property2: 'Property 2',
  property3: 'Property 3'


const objB: ExampleInterface = createExampleInterface(objA);

console.log(objB);

在https://stackblitz.com/edit/typescript-rjgcjp试试吧

【讨论】:

虽然在我的情况下我选择了“类而不是接口并使用构造函数”解决方案,但我认为这个答案对我的问题来说是正确的。【参考方案2】:

我认为因此一个类可能是更好的选择,因为您可以在那里创建一个构造函数并将另一个对象作为参数提供给它,如下所示:

    export class ExampleDomainObject 
        constructor(obj: AnotherObjectThatHasMoreProperties) 
            this.myProp = obj.myProp;
            // here you apply all properties you need from AnotherObjectThatHasMoreProperties
        

    

如果有帮助请告诉我:)

【讨论】:

是的,最后我承认类比接口更适合我的情况,谢谢。 :) 很高兴它有帮助:)

以上是关于Typescript 基于接口从另一个对象创建一个对象的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 TypeScript 接口创建一个“空”对象?

如何创建两个从另一个派生的 ATL 接口?

创建一个具有可变长度数组的接口,其中包含 TypeScript/Angular4 中的对象

如何根据 TypeScript 中的接口文件定义创建对象?

当我从另一个调用接口方法时,Spring Boot(Java)中出现以下错误

该对象的 Typescript 接口是不是正确?