javascript - TypeScript: Cum să setezi o proprietate a obiectului în constructor (în funcție de proprietățile obiectului)


  1. Dacă elementul din Constructor are proprietatea counter (item.counter), trebuie să creez această proprietate în elementul constructorului (this.counter). Cum să creez această proprietate doar dacă acest element are proprietatea?
  2. Și următoarea întrebare, cum să creezi o nouă proprietate în constructor, în funcție de o condiție (de exemplu, dacă item.is_owner=true, trebuie să creez this.owner="Owner")

export class Item {
    public counter: number;
    public is_owner: boolean;
    public owner: string;
    
    
    constructor(item) {
        this.counter = item.counter; // if item has counter, i need create this.counter
        this.owner = "Owner"; // if item.is_owner == true ???
    }
}

var element = new  Item (item);

Răspuns #1

Este greu de înțeles ce încerci să faci din codul tău, de exemplu ce este acest item pe care ctor îl primește ca parametru? Este o altă instanță de Item sau alt tip?
De asemenea, toată treaba cu owner-ul nu este clară.

În orice caz, clasa ta are fie o proprietate definită, fie nu.
Desigur, poți adăuga mai multe proprietăți în constructor fără a le defini ca membri, dar acest lucru va cauza erori de compilare în TypeScript, pe care probabil preferi să le eviți, de exemplu:

class Point {
    public x: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y; // error: Property `y` does not exists on type `Point`
    }
}

Poți rezolva asta făcând conversia la any:

class Point {
    public x: number;

    constructor(x: number, y: number) {
        this.x = x;
        (this as any).y = y; // no error
    }
}

Dar apoi aceasta este o problemă:

let p = new Point(10, 5);
console.log(p.x);
console.log(p.y); // error: Property `y` does not exists on type `Point`

Aici puteți folosi any: console.log((p as any).y);, dar atunci ocoliți verificarea tipurilor de către compilator și dacă faceți asta, atunci de ce să folosiți TypeScript deloc?

Ce poți face dacă vrei să eviți să ai membrul cu null sau undefined este să ai implementări diferite ale aceleiași interfețe/clase de bază și să folosești o funcție de fabrică pentru a crea implementarea corectă în funcție de datele primite, ceva de genul:

interface ItemData {
    counter?: number;
}

class BaseItem {
    static create(data: ItemData): BaseItem {
        if (data.counter) {
            return new ItemWithCounter(data);
        }

        return new BaseItem(data);
    }

    constructor(data: ItemData) {}
}

class ItemWithCounter extends BaseItem {
    private counter: number;

    constructor(data: ItemData) {
        super(data);
        this.counter = data.counter;
    }
}