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
53 komentarzy
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Tomek
Tomek
4 miesięcy temu

Wersja papierowa 43.1.0-0-g84d034d . Literówka.
Rozdział 3.11 Niestandardowe elementy języka:
„… Wśród nich należy wymienić:
-dekoratory,
-własności klasm ” – „m” zamiast przecinka

Daniel
Daniel
8 miesięcy 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ć?

Piotr
Piotr
8 miesięcy 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?

Daniel
Daniel
8 miesięcy 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
8 miesięcy 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
8 miesięcy temu

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

Screenshot_20200823-153011.jpg
Mateusz
Mateusz
8 miesięcy 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
8 miesięcy 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
8 miesięcy 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
8 miesięcy temu

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

Screenshot 2020-08-27 at 11.01.06.png
Łukasz
Łukasz
8 miesięcy 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
8 miesięcy 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
8 miesięcy 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
8 miesięcy 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
8 miesięcy 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 😛

DominikaD
Dominika (@dommie73)
8 miesięcy temu

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

const age = genearateAge(); // generateAge()
DominikaD
Dominika (@dommie73)
8 miesięcy 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 miesięcy temu

[6.5][9.5]

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

Typem zwracanym powinien być boolean.

DominikaD
Dominika (@dommie73)
8 miesięcy 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 miesięcy 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 miesięcy 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ł
8 miesięcy 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)
8 miesięcy 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)
8 miesięcy 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)
8 miesięcy 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)
7 miesięcy 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())
Paweł Próchnicki
Paweł Próchnicki (@p_prochnicki_defy)
7 miesięcy temu

Jest problem, z plikami 'epub' na Macu z iBooks nie pojawia się większość wstawek z przykładowym kodem. Da się coś z tym zrobić?

Grzegorz
Grzegorz
7 miesięcy temu

str. 97
7.3

Są to metody abstrakcyjne i oznacza się je również słowem

kluczowym abtract

Sądzę, że powinno być abstract

Piotrek
5 miesięcy temu

ksiazka drukowana:
str.48 – drugi <ul>, drugi <li> – klasm (literowka)
str. 120 – const arr / const objects – skoro dopisujemy tylko typ to czy nie lepiej byloby zostawic nazwe zmiennej bez zmian?

Maksymilian
Maksymilian
4 miesięcy temu

str. 72
dla podanego typu z wartościami low, medium, high, Level byłoby lepszą nazwą niż Name

Maksymilian
Maksymilian
4 miesięcy temu

s. 221 Wyrażenie ze środka pierwszego akapitu, że „przykład napotkał mnie” jest nieintencjonalnie zabawne 🙂 Dlatego, że jeśli już, to raczej Michał napotkał przykład, a nie przykład napotkał Michała. Chociaż najlepiej gdyby to zdanie brzmiało troszkę inaczej, np.: „[…] przykładowi wziętemu z życia, który znam z pracy […]”.

Maksymilian
Maksymilian
4 miesięcy temu

s. 320 możemy pobrać stworzyć typ

Adrian
Adrian
2 miesięcy temu

Avatar Michał Miszczyszyn Cześć, zastanawia mnie przykład z 6.9. W funkcji getConfig bez typów mamy możliwość nadpisywania własności DEFAULT_CONFIG i dodawania nowych dzięki temu warunkowi:
if (typeof overrides === 'object') { return { …DEFAULT_CONFIG, …overrides }; }
Jednak w wersji TS przez definicję typu Arg działa to już zupełnie inaczej. Mamy możliwość przekazania obiektu tylko z polem enc. Jeśli spróbujemy nadpisać DEFAULT_CONFIG to walnie błędem.
type Arg = { enc: string } | string | undefined;
Nie lepiej jest to otypować w ten sposób? Dzięki temu pierwszy warunek z getConfig działa tak jak w pierwotnej wersji
type Config = { in: string; out: string, [key: string]: unknown };
type Arg = Record<string, unknown> | string | undefined;

Damian CzapiewskiD
Damian Czapiewski (@damianwlkp)
1 miesiąc temu

7.4.3. Wywoływalne i konstruowalne interfejsy (str. 99)

interface Callable {
  render(name: string): boolean;
  inject: Array<string>;
}

Napisałeś, że interfejs Callable opisuje funkcję, która posiada właściwość inject. W rzeczywistości opisuje on obiekt z metodą render() i właściwością inject.

Dla funkcji z właściwością powinno być:

interface Callable {
  (name: string): boolean;
  inject: Array<string>;
}
Back to Top