我个人为我的模型使用接口,关于这个问题有 3 所学校,通常根据您的要求选择一个:
1- 接口:
interface 是一个仅存在在 TypeScript 上下文中的虚拟结构。 TypeScript 编译器仅将接口用于类型检查。一旦你的代码被转译成它的目标语言,它就会从它的接口中被剥离——JavaScript 不是类型化的。
interface User {
id: number;
username: string;
}
// inheritance
interface UserDetails extends User {
birthdate: Date;
biography?: string; // use the '?' annotation to mark this property as optionnal
}
如果您使用的是 HttpClient,则将服务器响应映射到 interface 非常简单,如果您使用的是 Angular 4.3.x 及更高版本,则从 HttpClientModule 开始。
getUsers() :Observable<User[]> {
return this.http.get<User[]>(url); // no need for '.map((res: Response) => res.json())'
}
何时使用接口:
- 您只需要定义服务器数据,而不会为最终输出引入额外开销。
- 您只需要传输数据,无需任何行为或逻辑(构造函数初始化、方法)
- 您不会经常从界面实例化/创建对象
- 使用简单的对象文字表示法
let instance: FooInterface = { ... };,您可能会冒着到处都有半实例的风险。
- 这不会强制执行类给出的约束(构造函数或初始化逻辑、验证、私有字段的封装...等)
- 您需要为您的系统定义合同/配置(全局配置)
2- 类:
class 定义对象的蓝图。它们表达了这些对象将继承的逻辑、方法和属性。
class User {
id: number;
username: string;
constructor(id :number, username: string) {
this.id = id;
this.username = username.replace(/^\s+|\s+$/g, ''); // trim whitespaces and new lines
}
}
// inheritance
class UserDetails extends User {
birthdate: Date;
biography?: string;
constructor(id :number, username: string, birthdate:Date, biography? :string ) {
super(id,username);
this.birthdate = ...;
}
}
何时使用类:
- 您实例化您的类并随着时间的推移更改实例状态。
- 您的类的实例将需要查询或改变其状态的方法
- 当您希望将行为与数据更紧密地关联起来时;
- 您对实例的创建实施约束。
- 如果您只在类中编写一堆属性分配,您可以考虑改用类型。
2- 类型:
随着最新版本的 typescript,接口和类型变得更加相似。
types 不要在应用程序内部表达逻辑或状态。当您想描述某种形式的信息时,最好使用类型。它们可以描述不同形状的数据,包括字符串、数组和对象等简单结构。
与接口一样,类型只是不会转译为任何 javascript 的虚拟结构,它们只是帮助编译器让我们的生活更轻松。
type User = {
id: number;
username: string;
}
// inheritance
type UserDetails = User & {
birthDate :Date;
biography?:string;
}
何时使用类型:
- 将其作为简洁的函数参数传递
- 描述一个类的构造函数参数
- 记录从 API 传入或传出的中小型对象。
- 它们不携带状态或行为