Odczytanie atrybutu obiektu

0

Czołem
Mam klasę, o taką, z jedną przykładową metodą — getterem

export default class Place {
type: placeVariants;
place: GeolocationORCityNameType;
fromFavorites: boolean;
forecastURL: string;
weatherURL: string;

constructor(type: placeVariants, place: GeolocationORCityNameType, fromFavorites = false) {
    this.type = type;
    this.place = place;
    this.fromFavorites = fromFavorites;
    this.forecastURL = createURL.forecast(place as Location, type);
    this.weatherURL = createURL.weather(place as Location, type);

    get label() {
    switch (this.type) {
        case placeVariants.CITY:
            return this.place as string;
        case placeVariants.LOCATION:
            return `Lat.: ${(this.place as Location).latitude.toFixed(4)} Lon.: ${(
                this.place as Location
            ).longitude.toFixed(4)}`;
        default:
            return 'non-specified value (type) passed to  createLabelforHeader method';
    }
}
}

Problem polega na tym, że:
Najbardziej bym się ucieszyła, gdyby można było z takiej klasy 'wyciągnąć' typ instancji bezpośrednio. Ale o ile dobrze rozumiem kilka wątków, nie można.

Chyba że jest jakiś hack? Ale jeżeli ni i jeżeli wszystko trzeba przepisać ręcznie: czy getter należy typować jako wartość zwracaną, czy jako funkcję? Pytam, bo sam w sobie getter jest swojego rodzaju hackiem i właściwie nie wiem, co ma pod pokrywką.

Tak więc jeżeli ktoś zna hacka albo odpowiedź to bym prosiła :)

2
Doctanna napisał(a):

Najbardziej bym się ucieszyła, gdyby można było z takiej klasy 'wyciągnąć' typ instancji bezpośrednio. Ale o ile dobrze rozumiem kilka wątków, nie można.

To znaczy odczytać atrybut type? Można tak po prostu.

const place = new Place();
place.type

Chyba że jest jakiś hack? Ale jeżeli ni i jeżeli wszystko trzeba przepisać ręcznie: czy getter należy typować jako wartość zwracaną, czy jako funkcję?

Z reguły jako wartość.

Pytam, bo sam w sobie getter jest swojego rodzaju hackiem i właściwie nie wiem, co ma pod pokrywką.

To się nazywa enkaosulacja, i z reguły jest bardzo dobrym rozwiązaniem.

Właśnie przez to że "właściwie nie wiesz co jest pod spodem", taka klasa jest później łatwa do zmiany.

0
TomRiddle napisał(a):
Doctanna napisał(a):

Najbardziej bym się ucieszyła, gdyby można było z takiej klasy 'wyciągnąć' typ instancji bezpośrednio. Ale o ile dobrze rozumiem kilka wątków, nie można.

To znaczy odczytać atrybut type? Można tak po prostu.

const place = new Place();
place.type

Chyba że jest jakiś hack? Ale jeżeli ni i jeżeli wszystko trzeba przepisać ręcznie: czy getter należy typować jako wartość zwracaną, czy jako funkcję?

Z reguły jako wartość.

Pytam, bo sam w sobie getter jest swojego rodzaju hackiem i właściwie nie wiem, co ma pod pokrywką.

To się nazywa enkaosulacja, i z reguły jest bardzo dobrym rozwiązaniem.

Właśnie przez to że "właściwie nie wiesz co jest pod spodem", taka klasa jest później łatwa do zmiany.

To by było idealne, tylko że tutaj użyłam ''type" jako pola, sprawdziwszy uprzednio, czy nie jest na liście słów zarezerwowanych. I przy tej składni wyskakuje jego bieżąca wartość. Mea culpa pozostaje przemianować pole i sprawdzić

0

Ale że o co chodzi? Typ obiektu sobie możesz sprawdzić używając instanceof, ewentualnie biorąc pole __proto__.

0

@szatkus1:

szatkus1 napisał(a):

Ale że o co chodzi? Typ obiektu sobie możesz sprawdzić używając instanceof, ewentualnie biorąc pole __proto__.

Uściślając - atrybut nazywa się type przez mój błąd. Chodzi o type w dosłownym znaczeniu typu instancji klasy i użycie go w TS. Chciałam bez tworzenia instancji ale bezpośrednio z def. klasy. Niemniej rozwiązanie @TomRiddle też będzi dobre, jeśli zadziała ( a zęby tro zrobić musze zmienić nazewnictwo bo w tej chwili type to pole type przede wszystkim)

1
Doctanna napisał(a):

@szatkus1:

szatkus1 napisał(a):

Ale że o co chodzi? Typ obiektu sobie możesz sprawdzić używając instanceof, ewentualnie biorąc pole __proto__.

Uściślając - atrybut nazywa się type przez mój błąd. Chodzi o type w dosłownym znaczeniu typu instancji klasy i użycie go w TS. Chciałam bez tworzenia instancji ale bezpośrednio z def. klasy. Niemniej rozwiązanie @TomRiddle też będzi dobre, jeśli zadziała ( a zęby tro zrobić musze zmienić nazewnictwo bo w tej chwili type to pole type przede wszystkim)

No to jeśli tak to Twoim typem jest po prostu Place.

Może najlepiej będzie jak po prostu opiszesz dokładnie co chcesz zrobić

1
const p = new Place();
console.log(p instanceof Place); // true
console.log(p.__proto__ === Place); // true

Place to obiekt jak każdy inny i możesz się do niego odwoływać. Możesz też pomyśleć nad użyciem typów zależnych.

0

@TomRiddle: Tzn nazwa klasy będzie jednocześnie defnicją jej typu? Potrzebuję typ TS tego co będzie instancją klasy, żeby go wyeksportować jako typ i użyć w innym miejscu jako typ TS

2
Doctanna napisał(a):

@TomRiddle: Tzn nazwa klasy będzie jednocześnie defnicją jej typu? Potrzebuję typ TS tego co będzie instancją klasy, żeby go wyeksportować jako typ i użyć w innym miejscu jako typ TS

Klasa jest typem.

Możesz zrobić coś takiego

interface Something {
  place: Place
} 
2

Klasa w TypeScript jest automatycznie typem/interfejsem, więc możesz użyć takiej składni

Kompilator TypeScript pozwala używać klasy tak samo jak typu i interfejsu xDxD

class MyClass {}

const myObject: MyClass = new MyClass();

interface MyInterface extends MyClass {}

function myFunc(value: MyClass) {
  // ...
}

Po prostu używasz jej tak samo jak pozostałych rzeczy.

0

Wygląda na to, że

interface MyInterface extends MyClass {}

jest tym, czego brakowało, dzięki.
Zaraz sprawdzę jak się odpali tam gdzie potrzebne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1