首页 > 解决方案 > 从对象初始化 Typescript 类的最佳实践 (Object.assign)

问题描述

我想定义一个 TypeScript 类,它将通过一个普通对象(如数据库文档)接收它的属性。

class Car {
   color: string;
   
   constructor(props: ???) {
       Object.assign(this, props)
   }
 
}

最好的打字方式是props什么?

我可以创建另一个接口,在那里调用CarProps并定义它们,例如:

class Car implements CarProps { 
    constructor(props: CarProps) {
        Object.assign(this, props)
    }
}

然而,我正在为接口命名而苦苦挣扎,因为TypeScript 手册禁止以“I”开头的接口名称(例如 ICar)。由于我最终会得到一个定义“Car”的接口和类,因此它们不能具有相同的名称,因此它们中的一个必须像“CarProps”、“ICar”或“CarClass”一样偏移。

这种方法的一个问题是属性必须定义两次:

interface CarProps {
  color: string;
}

class Car implements CarProps {
  color: string; // duplication here
}

这里提供了一些解决方案(接口合并和抽象类):为什么在 TypeScript 中实现接口时需要重新定义属性?

将不胜感激有关此方法的最佳实践的任何建议。

标签: javascripttypescriptclass

解决方案


我认为 CarProps 方法很好,如果有帮助的话。

将其称为 ICar 或 Car 没有意义,但这是假设您的类将具有一些其他公共字段/方法,而不是您正在创建的接口中的那些。

如果不是这种情况,并且您想要 Car 中的一些字段副本,那么您可以使用Partial<Car>.

这样做的问题是它将包含所有公共属性和方法Partial- 因此您允许方法 vroom 可以被覆盖的情况(参见下面的 car2)。


class Car {
  foo: number = 123;

  constructor(props: Partial<Car>) {
    Object.assign(this, props);
  }

  vroom = () => {
    console.log('vroom');
  }
}

const car = new Car({ foo: 567 });

// Should this be allowed?
const car2 = new Car({ foo: 567, vroom: () => console.log('hello') });



推荐阅读