Подтвердить что ты не робот

Создание классов моделей в typescript

Привет Я новичок в typescritpt, и я исхожу из фона С# и Javascript. Я пытаюсь создать способ, который позволяет мне создавать модели классов, аналогичные тем, что мы можем делать на С#. Вот что я пробовал:

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 для этого?

4b9b3361

Ответ 1

То, что, по-видимому, вы пытаетесь выполнить, - это принудительное исполнение структуры модели. Хотя имеет смысл использовать класс в С# для достижения этого, в TypeScript лучший подход заключается в создании либо type, либо interface.

Вот примеры обоих (приведенные свойства для краткости)

Тип

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';

Отличный ресурс по типам можно найти здесь.

Ответ 2

Предоставление значений по умолчанию для полей должно делать то, что вы ищете.

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

Ответ 3

Да, вы можете это сделать.

Шаг 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