当前位置: 首页 > 知识库问答 >
问题:

在TypeScript中创建模型类

杜轩昂
2023-03-14

嗨,我是TypeScript新手,我来自C#和JavaScript背景。我正在尝试创建一种方法,使我能够创建类似于C#的类模型。

以下是我尝试过的:

export class DonutChartModel {
    dimension: number;
    innerRadius: number;
    backgroundClass: string;
    backgroundOpacity: number;
}

我希望这会生成一个JavaScript模型,公开声明的属性,但这只生成一个函数DonutChartModel,没有声明属性。

在查看文档之后,我注意到为了公开属性,我必须添加一个构造函数并从中初始化属性。虽然这可能会起作用,但在每个模型可能有20个或更多属性的情况下,这并没有帮助,因为在我看来,初始化可能看起来相当笨拙,而且它还稍微降低了可读性。

我希望有一种方法可以在不传递构造函数参数的情况下执行类似操作:

var model = new DonutChartModel();
model.dimension = 5
model.innerRadius = 20
....

TypeScript中是否有任何选项可以执行此操作?

共有3个答案

金旺
2023-03-14

为字段提供默认值应该符合您的要求。

export class DonutChartModel {
    dimension: number = 0;
    innerRadius: number = 0;
    backgroundClass: string = "";
    backgroundOpacity: number = 0;
}
轩辕瑞
2023-03-14

是的,你能做到。

步骤1:使用“类”创建模型。虽然TypeScript有可以提供此功能的接口,但Angular团队建议只使用带有强类型实例变量的裸ES6类。ES6类允许您(可选)围绕模型构建功能,也不需要您被锁定在特定于TypeScript的功能中。出于这些原因,建议使用类来创建模型。

export class DonutChartModel {

//Fields 
dimension: Number
innerRadius: Number
backgroundClass: Number
backgroundOpacity: Number
myPropertyToSet: String 

constructor (dimension: Number, innerRadius: Number){
   this.dimension = dimension
   this.innerRadius = innerRadius
}}

步骤2:将其导入组件。这将增加在多个位置重用数据模型的好处。

import { DonutChartModel } from '../../models/donut-chart-model;

步骤3:设置其中一个属性值:

export class MenuSelectionPage {

 myDonuts: DonutChartModel[] = [];

 constructor(public navCtrl: NavController, public navParams: NavParams) {
  this.FillLocalData()
  this.myDonuts[this.myDonuts.length - 1].myPropertyToSet = "I am your father" 
 } 

//Aux Methods
FillLocalData() {
let dimensions = [8.32, 5, 17];
let defaultInnerRadius = 2;
for (let i = 0; i < dimensions.length; i++) {
  let donut = new DonutChartModel (dimensions[i], defaultInnerRadius * i)
  this.myDonuts.push(donut)
}}}

步骤4(可选):在html中使用它。

 ...
 <ion-list>
    <button ion-item *ngFor="let donut of myDonuts">
    {{donut.myPropertyToSet}}
     </button>
 </ion-list>
 ...

注意:此代码已在离子3中测试

孔斌
2023-03-14

您试图完成的似乎是在模型上强制执行结构。虽然在C语言中使用类来实现这一点是有意义的,但在TypeScript中,最好的方法是创建类型接口

以下是两者的示例(为简洁起见,减少了属性)

type DonutChartModel = {
    dimension: number;
    innerRadius: number;
};
var donut: DonutChartModel = {
    dimension: 1,
    innerRadius: 2
};
interface IDonutChartModel {
    dimension: number;
    innerRadius: number;
}
var donut: IDonutChartModel = {
    dimension: 1,
    innerRadius: 2
};

接口可以从类扩展/按类扩展,最适合于定义属性时使用。

类型可以组合,并且应该更多地用于非复合属性。一个很好的例子是使用以下类型:

type Direction = 'up' | 'down' | 'left' | 'right';

关于类型的优秀资源可以在这里找到,或者作为TypeScript的答案:接口与类型。

 类似资料:
  • 在像C#这样的语言中,我可以声明一个列表列表,例如: 有没有类似的方法来在 TypeScript 中声明一个强类型数组数组?我尝试了以下方法,但都没有编译。

  • 我正在使用本文概述的typescript实现mongoose模型:https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models 我也不确定在处理子文档数组时这是如何翻译的。假设我有以下模型和模式定义: 将向user.pet子文档添加新宠物的代码: 在查看链接之后,这似乎是处理子文档所必需的理想方法。但是,此场景似乎会引

  • Entity Framework 使用一组惯例来构建基于实体类型的形状的模型。你可以指定额外的配置来补充或者覆盖被惯例所发现的内容 本文介绍的配置可以应用于针对任何数据存储的模型,并且可以应用于任何关系数据库。提供程序还可以启用为特定数据存储指定的的配置。查看 数据库提供程序 可了解提供程序指定配置的相关内容。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。 方法和配置 流式API

  • 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的

  • 在JavaScript中,我可以这样做: 然后在另一个文件中: 它将定义

  • 我正在尝试在Spring Boot 2.1.4中使用Querydsl。RELEASE,但失败了,因为未生成元模型。 这是错误消息: 这是我的pom.xml: 我试图以Maven生成源代码的方式运行项目,Maven构建目标:编译,但仍然不创建元模型类,甚至java文件夹不存在于生成的源代码文件夹中。 我正在使用Spring Tools Suite 3.9.4。释放。 如何解决这个问题...?