Errata

Książka „TypeScript na poważnie”

Informacje o książce znajdziesz tutaj: https://typescriptnapowaznie.pl

Dołożyłem wszelkich starań, aby w niniejszej książce znalazły się wyłącznie informacje rzetelne i sprawdzone. Przetestowałem każdy fragment kodu i każdy przykład. Pomimo tego, może się tak zdarzyć, że gdzieś wkradły się błędy.
Jeśli znajdziesz jakiekolwiek pomyłki, to proszę, koniecznie mi to zgłoś! Możesz to zrobić poprzez tę stronę (w sekcji komentarzy). W przyszłości znajdziesz tu również wypisane poprawki, które do książki zostały wprowadzone już po premierze, aby łatwiej Ci było się z nimi zapoznać.

Subscribe
Powiadom o
guest
33 komentarzy
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Daniel
Daniel
28 dni temu

Str. 48

Do niektórych rzeczy (np. async) jeszcze wrócimy w późniejszych rozdziałach. ?? Pozostałych punktów nie omawiałem tutaj, gdyż nie starczyłoby na wszystko miejsca

Tutaj ??, więc zakładam (może błędnie), że miały być tutaj podane w których rozdziałach, lub też nadmiarowe znaki zapytania?

Ta sama strona 48

Dociekliwe(-i) na pewno będą chciały(-eli) doczytać, żeby dowie- dzieć się jak najwięcej. A może już to zrobili? Tak, czy inaczej, oto lista polecanych przeze mnie zasobów, z których warto się uczyć:

@todo

Tutaj @todo, zakładam, że miały być materiały na potem, ale autor zapomniał dodać?

Daniel
Daniel
28 dni temu

Strona 32 w pdf, ostatnie zdanie przed podsumowaniem cytując:

W rozdziale ?? omówię poszczególne ustawienia oraz tak ważną rzecz, jak referencje do projektów. 

Zamiast ?? powinien być numer rozdziału.

Daniel
Daniel
28 dni temu

Str. 49

Ponieważ jednak niektóre popularne biblioteki zdecydowały się na oparcie swojego działania o dekoratory (np. Angular), nie mogłem ich zupełnie pominąć. O tym, jak działają dekoratory w TS dowiesz się w rozdziale ?? 

Brak podania numeru rozdziału.

Mateusz
Mateusz
28 dni temu

„robię zakłopotana mine I odpowiadam że *NIE* znam niczego konkretnego” zjadłeś „NIE

Screenshot_20200823-153011.jpg
Mateusz
Mateusz
27 dni temu

Patrz screen

trackback

[…] do wersji drukowanej. Raz zleconego druku nie można już później poprawić, a errata online to fajny bonus, ale za mało, żeby pozwolić na wydruk z oczywistymi […]

Adam
Adam
24 dni temu

ROZDZIAŁ 7.4.2
przykład:
const ex: Example = {
cannotUpdateMe: „abc”,
};
// 1
ex.optionalProperty = 123; // OK
1007.4 Interfejs
// 2
ex.cannotUpdateMe = „a”; // Błąd!

brakuje readonly przy connotUpdateMe oraz brakuje pola optionalProperty?.

Łukasz
Łukasz
24 dni temu

Rozdział 1.5,

Gdyby statyczne i dynamiczne typowanie chcieć opisać dwoma innymi słowami, to za pewne byłyby to „pewność” i „niepewność”. 

W tym kontekście „za pewne” powinno być łącznie.

Łukasz
Łukasz
24 dni temu

Kindle paperwhite 3 wypluł ?? zamiast numeru rozdziału tak jak na screenie.

Screenshot 2020-08-27 at 11.01.06.png
Łukasz
Łukasz
24 dni temu

Kindle paperwhite 3 – ten snippet kodu jest przełamany do nowej linii w środku nazwy argumentu. Być może kwestia jakichś parametrów przy tworzeniu mobi – nie mam pojęcia, ale było by ciut czytelniejsze.

Screenshot 2020-08-27 at 11.06.01.png
Marcin
Marcin
22 dni temu

4.2 Dynamiczne typowanie

Czy można pisać dobry kody używając

Powinno być „kod” – w liczbie mnogiej.
Mobi loc 1082

Marcin
Marcin
22 dni temu
Typowy przykład słabego typowania w akcji:
 
const a = "3" - 1; // 1 
const a = "3" + 1; // '31' 

W pierwszym przykładzie od ciągu znaków ‘3’ próbujemy odjąć liczbę 1 . Wynikiem jest liczba 2.

//1 a powinno być //2
Wylogowałeś źle, ale poniżej wytłumaczone jest git.

4.4 słabe typowanie

Kuba
Kuba
18 dni temu

Str. 119
Tutaj nie napisałem val: number , a mimo to TypeScript dokład-
nie „wiem”

chyba jednak TypEscript dokładnie „wie” 🙂

drillprops
drillprops
17 dni temu

W sumie pierdoła.
Strona 57

const a = „3” – 1; // 1

Co prawda poniżej piszesz, że wynikiem jest 2, ale błąd pozostaje 😛

Piotr
Piotr
10 dni temu

Cześć,

Wydaje mi się, że jest jakiś problem z epub – większość kodu nie jest renderowane pod Apple Books. Dałoby radę przegenerować plik?

DominikaD
Dominika (@dommie73)
8 dni temu

[3.6.1] W obu fragmentach kodu jest ta sama literówka:

const age = genearateAge(); // generateAge()
DominikaD
Dominika (@dommie73)
8 dni temu

[4.4] Przykład słabego typowania:

const a = "3" - 1; // 1

W komentarzu powinna być liczba 2. Błąd znajduje się tylko w kodzie, opis podaje już prawidłowy wynik.

DominikaD
Dominika (@dommie73)
8 dni temu

[6.5][9.5]

type Cb = (name: string, age: number) => bool;

Typem zwracanym powinien być boolean.

DominikaD
Dominika (@dommie73)
8 dni temu

[6.9]

function getConfig(overrides) { 
  // [...]
  else if (typeof overrides === "string") { 
    return { ...DEFAULT_CONFIG, enc: config }; 
  } 
  // [...] 
} 

Zamiast config powinno być overrides. Ta sama funkcja pojawia się w 6.9.1, ale nie zawiera już tego błędu.

DominikaD
Dominika (@dommie73)
8 dni temu

[7.5]

Wspominałem już o tym, że deklaracja klasy tworzy tak naprawdę dwa typy. Pierwszy z nich opisuje właśnie statyczne pola i funkcje, a drugi te, które znajdą się w instancjach danej klasy. W tym przypadku będą to, odpowiednio, User i typeof User (tak, to drugie to też nazwa typu!)

Z tego fragmentu wynika, że User opisuje statyczne pola i funkcje, a typeof User instancje klasy User. Tymczasem jest dokładnie odwrotnie 🙂

DominikaD
Dominika (@dommie73)
8 dni temu

[10.4] W kodzie mamy dwie klasy: Player i Hero. Tekst odwołujący się do tego przykładu mówi jednak o klasach Player i Animal:

Jeśli pole prywatne name zdefiniowalibyśmy w klasie wyżej, a Player i Animal by po niej dziedziczyły, błędu by nie było.

Michał
Michał
5 dni temu

Czytam epuba przez books na iOS 13.6.1 i nie ładują się przykłady kodu dla TS (JS są widoczne).

87BA828C-319B-46BE-BDBC-08437D6A8860.png
GanderD
Gander (@ganderpl)
5 dni temu

PDF / Rozdział 6.9 Przeładowywanie funkcji
Drugi blok „if”:

const DEFAULT_CONFIG = {
    in: "./in.txt",
    out: "out.txt",
};

function getConfig(overrides) {
    if (typeof overrides === "object") {
        return {...DEFAULT_CONFIG, ...overrides};
    } else if (typeof overrides === "string") {
        return {...DEFAULT_CONFIG, enc: config};
    } else if (typeof overrides === "undefined") {
        return DEFAULT_CONFIG;
    } else {
        throw new Error("Invalid config provided!");
    }
}

chyba powinno być:

} else if (typeof overrides === "string") {
        return {...DEFAULT_CONFIG, enc: overrides};
}
GanderD
Gander (@ganderpl)
5 dni temu

Powołując się na stosowanie dobrych praktyk programowania przykłady w rozdziałach 6.9 i 6.9.1 (oraz wszystkich o podobnym zapisie) powinny wyglądać w sposób następujący:

function getConfig(overrides) {
    if (typeof overrides === "object") {
        return {...DEFAULT_CONFIG, ...overrides};
    }
    
    if (typeof overrides === "string") {
        return {...DEFAULT_CONFIG, enc: overrides};
    }
    
    if (typeof overrides === "undefined") {
        return DEFAULT_CONFIG;
    }
    
    throw new Error("Invalid config provided!");
}

GanderD
Gander (@ganderpl)
5 dni temu

PDF / Rozdział 4.4 Słabe typowanie
Jest:

const a = "3" - 1; // 1
const a = "3" + 1; // '31'

Powinno być:

const a = "3" - 1; // 2
const a = "3" + 1; // '31'
GanderD
Gander (@ganderpl)
4 dni temu

[7.4.4]
Niemożliwe jest uruchomienie kodu z przykładu. IDE poprawił kod do poniższej postaci, i dopiero to działa:

interface Queue {
    push(val: string): void;


    pop(): string | undefined;
}


class ArrayQueue implements Queue {
    private array: Array<string> = [];


    push(val: string): void {
        this.array.push(val);
    }


    pop(): string | undefined {
        return this.array.pop();
    }
}

[8.4]
Kod po przeróbkach, który udało się uruchomić:

interface Queue<T> {
    push(val: T): void;


    pop(): T | undefined;
}


class ArrayQueue<T> implements Queue<T> {
    private array: Array<T> = [];


    push(val: T): void {
        this.array.push(val);
    }


    pop(): T | undefined {
        return this.array.pop();
    }
}


const tab = new ArrayQueue<string>();
tab.push('A');
tab.push('B');
tab.push('C');


console.log(tab.pop())