【问题标题】:Sugared typescript class constructor that accepts itself?接受自身的糖化打字稿类构造函数?
【发布时间】:2019-08-16 09:26:02
【问题描述】:

我正在从 CSV 文件中读取 Todo 实例,而 Papaparse 不会对日期进行动态转换,因此我可以将对象放入其自己的构造函数中进行转换:

class Todo {
    public dueDate:Date;
    ....
    constructor(todo:Todo) {
       this.dueDate = new Date(todo.dueDate);
       ...
    }
}

是否存在通过构造函数初始化属性的更巧妙的方法

【问题讨论】:

  • 我不相信,但你可以这样做stackoverflow.com/questions/32413025/…
  • 我试过 Object.assign 但它没有进行日期转换 - 只是分配了构造函数对象上的相同字符串...
  • 也许我没有完全理解你的问题。我想你问如何在构造函数上初始化值而不指定每个值,在这种情况下Object.assign 是你要找的。它不会处理您要对这些属性执行的任何其他逻辑,但您可以在分配中执行...Object.assign(this, todo, {dueDate: new Date(todo.dueDate)})
  • 所以你输入错误的构造函数参数?它根本不接受Todo,而是类似{[K in keyof Todo]: Todo[K] extends Date ? string : Todo[K]}(在您的精简示例中表示{dueDate: string}
  • @jcatz - 没有构造函数参数采用Todo 类实例的参数。虽然它不是一个有效的实例,因为日期是一个字符串。所以在构造函数中,日期字符串被包装在一个新的Date 对象中。这样就可以使用@IsDate 验证注解来验证实例。

标签: javascript node.js angular typescript


【解决方案1】:

使用 TypeScripts 自动属性,构造函数参数成为带有受保护、公共和私有前缀的属性。

class Todo {
    constructor(public dueDate:Date) { }
}

【讨论】:

  • 我认为我不能这样做,因为我正在使用 @IsDate dueDate 之类的验证约束来注释属性。 IIUC 这意味着我们不能将属性放在构造函数中?
  • 为什么要使用模型装饰器进行验证?验证不应该是表单问题吗?
  • 使用这个库……我建的……得吃我自己的狗粮……npmjs.com/package/@fireflysemantics/validator
  • 这些是读取的 CSV 记录...主要是业务数据...例如采购订单等。Todo 类插图只是为了保持简单。我主要需要日期转换,因为 papaparse 转换数字和布尔值。
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2016-09-14
  • 2019-04-13
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
相关资源
最近更新 更多