如何从现有对象初始化打字稿类?

Posted

技术标签:

【中文标题】如何从现有对象初始化打字稿类?【英文标题】: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'

谢谢,

【问题讨论】:

【参考方案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' 

【讨论】:

以上是关于如何从现有对象初始化打字稿类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在firebase云函数和角度之间共享打字稿类

将打字稿类转换为对象

如何在打字稿类中将 mat-stroked-button 更改为 mat-button?

折叠打字稿类成员的轮廓

Angular 7中与打字稿类紧密耦合的地图服务器响应列表

打字稿类嵌套json猫