# Kako opredeliti in uporabljati razrede TypeScript

Razredi TypeScript zagotavljajo jasen in strukturiran način za organizacijo podatkov in vedenja v **objektu**. To vam olajša modeliranje entitet in konceptov v vaši kodi.

## Kaj so razredi TypeScript?

Razredi so ključni pojem v TypeScriptu, ki je programski jezik, temelječ na JavaScriptu. Razredi predstavljajo **strukturirano metodo za definiranje objektov** in za uporabo objektno usmerjenega programiranja (OOP). Razredi v TypeScriptu so kot načrti za ustvarjanje objektov, ki združujejo logično povezane podatke in metode.

[TypeScript](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/kaj-je-typescript/) vsebuje vse funkcije JavaScript in vključuje tudi **statično tipiziranje**. To vam omogoča, da določite podatkovne tipe za [funkcije](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/funkcije-typescript/), spremenljivke in razrede [TypeScript](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/funkcije-typescript/), tako da lahko odkrijete napake v času kompiliranja. Poleg varnosti tipov razredi TypeScript podpirajo tudi koncepte, kot sta dedovanje in abstrakcija, kar olajšuje razvoj kompleksnih aplikacij.

S pomočjo razredov TypeScript lahko ustvarite jasno **hierarhijo razredov,** ki dedujejo lastnosti in metode. To spodbuja ponovno uporabo in strukturiranje kode. Konstruktorji razredov omogočajo inicializacijo instanc in zagotavljajo dosledno ustvarjanje objektov.

## Kakšna je sintaksa za razrede TypeScript?

Notacija razredov TypeScript je podobna notaciji **ECMAScript 6 (ES6)** in je razširjena različica sintakse razredov JavaScript. Razred TypeScript lahko vsebuje različne elemente za opredelitev strukture in obnašanja objektov. Glavne komponente so:

- **Lastnosti**
- **Konstruktorji**
- **Metode**

### Lastnosti

Lastnosti določajo **stanje objekta**. Shranjujejo vrednosti podatkov in jih je mogoče opremiti z opombami o podatkovnih tipih, tako da imajo samo veljavne vrednosti.

```typescript
class ClassName {
    propertyName: propertyType;
}
```

- **ClassName**: ime razreda
- **propertyName**: ime lastnosti, ki jo želite definirati
- **propertyType**: podatkovni tip lastnosti

Tukaj je konkreten primer:

```typescript
class Person {
    name: string;
}
```

Najprej je opredeljena razred `Person` z lastnostjo `name` tipa `string`. To pomeni, da imajo primeri razreda `Person` lastnost `name`, ki shranjuje **nize**.

### Konstruktor

Konstruktor v TypeScriptu je posebna metoda, ki se pokliče ob ustvarjanju instance razreda (objekta). Potreben je za **inicializacijo lastnosti objekta**. Konstruktor v bistvu definira začetno stanje instance. V konstruktorju lahko določite parametre za prenos vrednosti ob instanciranju razredov TypeScript.

Osnovna sintaksa konstruktorja v TypeScriptu je:

```typescript
class ClassName {
    constructor(parameter1: Type1, parameter2: Type2, ...) {
    }
}
```

- **konstruktor**: vsaka razred lahko ima en konstruktor. Če konstruktor ni definiran, se privzeto ustvari prazen konstruktor.
- **parameter: Tip**: parametri so neobvezni, odvisno od razreda in njegovih zahtev. Parametri morajo biti označeni s svojimi podatkovnimi tipi.

Primer konstruktorja:

```typescript
class Person {
    firstName: string;
    lastName: string;
    constructor(firstName: string, lastName: string) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
```

V zgornjem primeru ima razred `Person` konstruktor, ki sprejema dva parametra `firstName` in `lastName`. Pri **ustvarjanju instance** tega razreda se ti parametri prenesejo, konstruktor pa inicializira lastnosti `firstName` in `lastName` instance z ustreznimi vrednostmi. `this` se nanaša na trenutno instanco razreda, na kateri se izvaja koda.

### Metode

V TypeScriptu so metode funkcije, ki jih je mogoče definirati v razredih in uporabiti v njihovih primerkih. Metode omogočajo izvajanje **določenih dejanj ali operacij** v kontekstu razreda.

```typescript
class ClassName {
    // ...
    methodName(parameter1: Type1, parameter2: Type2, ...): ReturnType {
    }
    // ...
}
```

- **methodName**: ime metode
- **parameter: Tip**: neobvezni parametri, ki jih metoda sprejema
- **vrstaVrsta**: to je vrsta podatkov, ki določa vrednost, ki jo metoda vrne. Če metoda ne vrne ničesar, lahko navedete `void`.

Za dostop do lastnosti ali klic metode na primerku razreda uporabite operator piko `.`, ki mu sledi ime metode in zahtevani argumenti, če metoda pričakuje parametre.

```typescript
class Person {
    firstName: string;
    lastName: string;
    constructor(firstName: string, lastName: string) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    getFullName(): string {
        return this.firstName + " " + this.lastName;
    }
}
const person = new Person("John", "Doe");
const fullName = person.getFullName();
```

Metoda `getFullName` se uporablja za ustvarjanje in vrnitev polnega imena osebe. Dostopa do vrednosti lastnosti `firstName` in `lastName`, ki so definirane v razredu in inicializirane v konstruktorju. Objekt `person` se ustvari s ključno besedo `new`, ki ji sledi ime razreda in ustrezni parametri. Metoda pri klicu **združi dva niza** in vrne polno ime kot niz. Izhod za objekt `person` je torej „John Doe“.

## Primeri razredov TypeScript

Razredi TypeScript imajo različne mehanizme za organizacijo in nadzor **strukture in obnašanja objektov**. V nadaljevanju predstavljamo nekaj konceptov za uporabo razredov TypeScript.

### Dostop

TypeScript ponuja tri modifikatorje dostopa: `public`, `private` in `protected` za nadzor dostopa do lastnosti in metod znotraj in zunaj razreda.

- **javno (standardno)**: lastnosti in metode, označene s `public`, se lahko pokličejo od kjerkoli, tako znotraj kot zunaj razreda.
- **zasebno**: `private` se nanaša na lastnosti in metode, ki jih je mogoče poklicati le znotraj razreda. Zunanji deli kode do njih nimajo dostopa.
- **zaščiteno**: lastnosti in metode, označene s `protected`, lahko pokliče razred sam in izvedeni razredi (v dedovanju), vendar ne zunanji koda.

```typescript
class Person {
    private socialSecurityNumber: string;
    constructor(ssn: string) {
        this.socialSecurityNumber = ssn;
    }
    greet() {
        console.log("Hello, I am a person with SSN: " + this.socialSecurityNumber);
    }
}
const person = new Person("123-45-6789");
person.greet();
```

V tem primeru je `socialSecurityNumber` zasebna lastnina, do katere je mogoče dostopati samo znotraj razreda `Person`. Vendar pa lahko metodo `greet` pokličete zunaj razreda.

### Dedovanje

Dedovanje je temeljni pojem v objektno usmerjenem programiranju (OOP), ki se uporablja v TypeScriptu in mnogih drugih internetnih programskih jezikih. Omogoča ustvarjanje nove razreda na podlagi obstoječega **osnovnega razreda ali nadrazreda**. Izpeljani razred (podrazred) podeduje lastnosti in metode osnovnega razreda in jih lahko razširi ali prilagodi.

```typescript
class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    makeSound() {
        console.log("Some generic sound");
    }
}
class Dog extends Animal {
    makeSound() {
        console.log(this.name + " barks");
    }
}
const myDog = new Dog("Buddy");
myDog.makeSound();
```

Z uporabo ključne besede `extends` podrazred `Dog` podeduje lastnosti in metode iz nadrazreda `Animal`. Razred `Dog` nadomesti metodo `makeSound`, da doda določeno vedenje, hkrati pa podeduje lastnost `name` iz `Animal`.

### Samo za branje

Z `readonly` lahko deklarirate lastnosti razredov ali objektov TypeScript kot **samo za branje**. To pomeni, da ko je lastnost samo za branje inicializirana, njene vrednosti ni več mogoče spremeniti.

```typescript
class Circle {
    readonly pi: number = 3.14159;
    radius: number;
    constructor(radius: number) {
        this.radius = radius;
    }
    getArea() {
        return this.pi    *this.radius*    this.radius;
    }
}
const myCircle = new Circle(5);
console.log(myCircle.getArea()); // Output: ≈ 78,54
```

V našem primeru je lastnost `pi` samo za branje in se inicializira v konstruktorju. Po inicializaciji se `pi` ne more več spreminjati. Če poskušate spremeniti vrednost `pi` po inicializaciji, bo TypeScript ustvaril napako pri prevajanju.


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/razredi-typescript/](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/razredi-typescript/) for AI/LLM consumption.