javascript - 从对象初始化 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 中实现接口时需要重新定义属性?
将不胜感激有关此方法的最佳实践的任何建议。
解决方案
我认为 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') });
推荐阅读
- python - 如何获得 PyQt 方法的正确签名
- node.js - 为什么这个 Node readline 提示不等待用户输入?
- python - 如何从较大的数组中创建一个新的较小数组,取旧数组元素的平均值?
- c - 在函数中返回 char 的问题
- bash - 如何使用 terragrunt before_hook 设置变量
- python - 使用 apply 函数将一列的值转移到对应列的另一列
- pycharm - 对一条语句禁用 PyCharm SQL 检查
- c# - C# Word Interop 将图像从一个文档剪切/粘贴到另一个文档
- android - Android Studio Preview 与结果不一样
- python - 使用代理时,Linux 上的 Python 请求输出韩语而不是英语?它在 Windows 上运行良好