javascript - 如何在 Angular 2 中使用 Typescript 类和接口(interface)实现 "schema"以进行表单验证?

标签 javascript angularjs typescript angular rxjs

我目前正在学习 TypeScript 和 Angular 2 框架。我阅读了 Dan Wahlin 关于 TypeScript 类和接口(interface)的一些文章( herehere ),并进一步在 Github 上看到了一些关于数据驱动表单和表单控件定义的讨论( 12 和 & 3)。

举个例子,我正在尝试滚动一个用于用户注册的注册表单。要求如下:

  1. 需要一个 User 对象作为客户端可观察对象,以及 3 个用于注册到后端的附加字段

  2. 注册是多步骤的,并且发生在多个模板上。因此,当 new User所以我认为我需要可选的运算符或一个为 null 的基础对象(以避免应用程序编译时出现 TypeScript 错误)

  3. 我想为某些字段设置选项(即性别为“男性”或“女性”),类似于 Dan 设置 IAutoOptions 的方式在 Auto 的构造函数中在 this article 。我知道我可以使用 ngForm、ControlGroups 或 FormBuilder 来设置这些,但我想知道是否有办法使用 TypeScript 来完成此操作,以便我可以使其可供“appState”可观察对象访问。

    <

我目前的设置如下:

 export interface User {
    gender?: string;
    seeking?: string;
    email?: string;
    username?: string;
    birth_date?: Date;
    country?: string;
    zipcode?: string;
 }

export interface BackendUser extends User {
    password?: string;
    password_confirm?: string;
    agreed?: boolean;
}

底座User整个应用程序都需要界面,并且 BackendUser接口(interface)已扩展为在注册期间提供三个附加字段。我目前将所有字段设置为可选,因为如果未提供某些参数,我的应用程序将无法编译。

  1. class 和有什么区别和interface在 TypeScript/ES6 中?我想我正在使用 extends正确地在这里(按照 Wahlin 的示例),但我不确定是否应该使用 classinterface这里。我看到的大多数例子都只是使用 class .
  2. 使用 ? 的风格是否正确这里可选参数?可观察对象在三个不同阶段获取 User 值,当我没有所有值时,TypeScript 会抛出错误。我见过一些例子,其中某种 null用户对象在启动时启动,随后覆盖其属性,但不确定这是否是最佳实践或null在这种情况下,对象会喜欢。
  3. 有什么方法可以设置类似 #3 中引用的模式的选项吗?这些选项在构造函数中设置,如 this.engine = options.engine; ,但我不知道 options.engine 在哪里来自。

非常感谢任何建议或正确方向的观点!谢谢!

最佳答案

我可以回答第一个问题:

  • 接口(interface)提供类型的定义。
  • 类定义类型的实现。

因此,例如,可以同时拥有 Product 接口(interface)和 Product 类。该接口(interface)定义了特定类型所需的一组有效属性(以及可选的方法)。然后,类可以实现该接口(interface)并提供获取/设置值和所有方法所需的代码。

我所看到的一般经验法则是,如果您想要强类型化数据,但没有真正的方法,那么只需使用接口(interface)即可。例如,如果您的代码管理一系列产品,那么您可以定义一个产品接口(interface)来对这些产品进行强类型化。

如果您还有一些操作,例如根据多个产品属性计算最低价格或计算标准折扣,则可以用一个类来实现这些操作。

(我没有使用您的“用户”示例,以防止需要引用“用户界面”并引起困惑。)

关于javascript - 如何在 Angular 2 中使用 Typescript 类和接口(interface)实现 "schema"以进行表单验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493149/

相关文章:

javascript - 使用 AngularJS 组织子应用程序模块

javascript - 与 ui-sref 的链接不显示正确的 css

angular - @angular/common/http/testing TestRequest.flush 一个 boolean 值

javascript - 如果我在 `module.exports` 上定义模块,那么 `global` 有什么好处?

javascript - postman 大号问题

javascript - 限制 javascript 中的小数位不适用于 4.45678765e-6

angularjs - 使用 AngularJS 在 HighCharts 中单击事件和双向数据绑定(bind)

javascript - 纯 JS 中的两种方式数据绑定(bind)?

typescript - 在编译时强制指定两个 props 之一?

angular - 如何使用 ng2 图表在圆环图中显示标签?