【问题标题】:How to initialize a typescript class from existing object?如何从现有对象初始化打字稿类?
【发布时间】:2021-08-15 03:37:58
【问题描述】:

这可能看起来与之前的问题相似,但我没有找到答案,所以我在这里问了。 我的例子:

Class A{
  id:number;
  name:string;
}

Class B{
  id:number;
  name:string;
  age:number;
  grade:number;
}

const b = new B {id:1, name:'John', age: 20, grade: 10}

现在我想用 B 类的两个属性初始化 A 类的一个新实例。 像这样的:

const a = b as A;

我需要我的结果如下所示:

a = {id:1, name:'John'}

谢谢,

【问题讨论】:

    标签: javascript json typescript object initialization


    【解决方案1】:

    代码

    class A {
      id: number;
      name: string;
    
      constructor(id: number, name: string) {
        this.id = id;
        this.name = name;
      }
    
      static toA<T extends { id: number, name: string }>({ id, name }: T): A {
        const newObject = new A(id, name);
        return newObject;
      } 
    }
    

    说明

    仅通过欺骗 TypeScript 是无法改变运行时结构的。 as 只是告诉 TypeScript “不要想太多,只要假设 bA”,TypeScript 不会做任何事情(包括为您编写 B 到 A 转换器),除非假设该对象的类型在类型检查(编译)时是A

    所以,我们应该为它写一个显式的转换器。我们收到了包含必填字段的任何对象,然后使用这些字段创建一个新的 A 对象。

    示例

    class A {
      id: number;
      name: string;
    
      constructor(id: number, name: string) {
        this.id = id;
        this.name = name;
      }
    
      static toA<T extends { id: number, name: string }>({ id, name }: T): A {
        const newObject = new A(id, name);
        return newObject;
      } 
    }
    
    class B extends A {
      test: number;
    
      constructor(id: number, name: string, test: number) {
        super(id, name);
        this.test = test;
      }
    }
    
    const b = new B(1, "hi", 2);
    console.log(A.toA(b)); // A { id: 1, name: 'hi' }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2018-08-14
      • 2020-07-26
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多