TypeScript obsługuje operator typeof nie tylko w czasie wykonywania (jak w JavaScript), ale także na etapie kompilacji do wyprowadzania typu wyrażenia. Umożliwia to uzyskanie typu już zadeklarowanej zmiennej, funkcji lub struktury obiektu, co sprawia, że typizacja jest elastyczna i zmniejsza prawdopodobieństwo duplikacji i niesynchronizacji typów.
Początkowo w JavaScript operator typeof był używany do określania typu wartości w czasie wykonywania. TypeScript rozszerzył ten mechanizm — teraz typeof na etapie kompilacji tworzy odniesienie do typu wartości zmiennej lub wyniku funkcji. Jest to niezwykle przydatne podczas pracy ze złożonymi strukturami, konfiguracjami, a także przy ponownym używaniu typu między modułami.
Podczas ręcznego zadawania typu łatwo popełnić błąd: zmienić definicję struktury i zapomnieć zaktualizować deklarację type lub interface, lub błędnie skopiować typy między obiektami. Prowadzi to do niesynchronizacji kodu i błędów w czasie wykonywania. Przy użyciu typeof typ wyprowadzany jest dynamicznie i zawsze odpowiada aktualnej strukturze danych.
Do zadania zmiennej z typem odpowiadającym już istniejącej strukturze lub stałej, zastosuj operator typeof:
const config = { host: "localhost", port: 8080, }; let serverCfg: typeof config; // Typ serverCfg jest taki sam, jak config
Do typizacji funkcji zwracającej określoną strukturę:
function makeUser() { return { id: 1, name: "Alex" }; } type User = ReturnType<typeof makeUser>; // User: {id: number; name: string;}
Kluczowe cechy:
typeof w TS zwraca typ wartości zmiennej lub wyniku wyrażenia na etapie kompilacji.ReturnType, Parameters), a także z keyof w celu uzyskania listy kluczy obiektu.Czy operator typeof w TypeScript działa w czasie wykonywania?
Nie, typowy typeof działa tylko podczas kompilacji, nie trafiając do kodu wykonywalnego, chociaż operator JavaScript typeof istnieje także w czasie wykonywania.
Czy typeof można używać do wyprowadzania typu właściwości klasy?
Tak, ale tylko jeśli właściwość została już zadeklarowana jako statyczna lub z wartością początkową, w przeciwnym razie wystąpi błąd. Dla private/public protected — brane są pod uwagę tylko publiczne właściwości/metody.
Czy jest różnica między 'let x: typeof y;' a 'let x = y;'?
Z punktu widzenia typów — w obu przypadkach kompilator automatycznie wyprowadzi typ. Jednak 'typeof' można używać do zapisywania deklaracji typów bez inicjalizacji lub do bardziej skomplikowanych kombinacji z typami pomocniczymi.
typeof do zwykłej kontroli typu typeof x === 'string' — to runtime, a nie typ kompilowany.W projekcie opisuje się dużą strukturę opcji aplikacji oddzielnie jako typ, osobno jako zmienną. Przy zmianie struktury zapominają zaktualizować typ, co prowadzi do błędów w działaniu API.
Plusy: Elastyczna praca z typami, możliwość nadpisywania typów przez type lub interface.
Minusy: Duże ryzyko niesynchronizacji struktury i typów, słaba możliwość utrzymania.
Użycie typeof do uzyskania aktualnego typu struktury obiektu przy zadawaniu nowych zmiennych i przy generowaniu typu dla interfejsu API.
Plusy: Typ zawsze odpowiada wartości, niskie prawdopodobieństwo błędu, dobra autouzupełnianie.
Minusy: Jeśli obiekt jest bardzo złożony, końcowy typ może być trudny do zrozumienia dla nowicjuszy.