Odczytanie atrybutu obiektu

Odczytanie atrybutu obiektu
DO
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:165
0

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

Kopiuj
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 :)

edytowany 3x, ostatnio: Riddle
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
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.

Kopiuj
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.

edytowany 5x, ostatnio: Riddle
DO
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:165
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.

Kopiuj
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ć

szatkus1
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
0

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

Riddle
Jej chodzi o atrybut, który po prostu się nazywa type.
DO
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:165
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)

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
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ć

edytowany 1x, ostatnio: Riddle
szatkus1
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
1
Kopiuj
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.

KamilAdam
A co tu pomogą typy zależne?
szatkus1
W kodzie w pierwszym poście coś tam rzutuje do różnych typów. Nie wiem, dalej nie potrafię rozgryźć, o co chodzi :D
DO
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:165
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

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
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

Kopiuj
interface Something {
  place: Place
} 
edytowany 2x, ostatnio: Riddle
Zobacz pozostałe 2 komentarze
KamilAdam
Tam gdzie nie ma klas a typy dalej istnieją tak na szybko :P
Riddle
To że klasa jest typem, nie oznacza że typ jest klasą.
KamilAdam
A tak na wolno kiedyś czytałem rozważania teoretyczne że typem jest interfejs a klasy dopiero mogą sobie implementować ten interfejś
KamilAdam
To że klasa jest typem, nie oznacza że typ jest klasą. Racja
Riddle
Jeśli klasy mają interfejs, a interfejs jest typem, to klasa też jest typem. Poza tym, klasy również mają interfejs, nawet jeśli nie implementują żadnego jawnie zdefiniowanego interfejsu.
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około godziny
  • Postów:847
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

Kopiuj
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.

edytowany 3x, ostatnio: Xarviel
Zobacz pozostałe 3 komentarze
Xarviel
No wiadomo, że to "automatycznie" wiąże ze sobą cały proces zadań, ale tak jak powiedziałem, programista nie musi pisać żadnych dodatkowych instrukcji, żeby zamienić klasę w interfejs/typ, bo zostaje to wygenerowane przez kompilator, ale zamieniłem treść posta, żeby było lepiej.
Riddle
TypeScript pozwala używać klasy tak samo jak typu to brzmi tak samo jak Możesz używać czapki tak samo jak nakrycia głowy. Owszem, bo czapka jest nakryciem głowy, podobnie jak klasa jest typem. Co w tym dziwnego.
Riddle
programista nie musi pisać żadnych dodatkowych instrukcji, żeby zamienić klasę w interfejs/typ, bo zostaje to wygenerowane przez kompilator Co Ty bredzisz, jakie wygenerowane? ;| Klasa po prostu jest typem.
Xarviel
Sam coś bredzisz i się przyczepiłeś o jedno słowo, zamiast skupić się na temacie posta.
Riddle
Mówisz o tym że niby klasy są jakoś "konwertowane" na typy, albo "typy są generowane z nich"; podczas gdy nie dostrzegasz że klasa po prostu jest typem w TypeScript.
DO
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:165
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.