• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

TypeScript-Dokumentacja błąd, wyjaśnienie

VPS Starter Arubacloud
+1 głos
255 wizyt
pytanie zadane 8 stycznia 2022 w JavaScript przez PramatycznyJunior Początkujący (420 p.)

Hej mam pewien problem z dokumentacją typeScript - otóż na stronie ten kod jest opisany iż powinien nie zwracać błędów jednak je zwraca, mówię poniżej, sam bym się zdziwił ale juz nie wiem co jest poprawne.
Chodzi o typ "any" -> i to że można wywołać na nim nieistniejące funkcje tutaj foo() np.
 

let obj: any = { x: 0 };
// None of the following lines of code will throw compiler errors.
// Using `any` disables all further type checking, and it is assumed 
// you know the environment better than TypeScript.
obj.foo();        // to sie jednak nie wykonuje tzn. leci błąd
obj();           //  leci błąd tak samo.
obj.bar = 100;
obj = "hello";
const n: number = obj;

dalej mam problem ze zrozumieniem tego fragmentu kodu : 

Pierwsza to funkcja 
 

function sayName({ first, last = 'Smith' }: {first: string; last?: string }): void {
  const name = first + ' ' + last;
  console.log(name);

dokładnie nie rozumiem tego ({ first, last = 'Smith' }: {first: string; last?: string })

co tutaj robi operator ":" dwukorpka? rozumiem wartość default Smith jeśli last nie zostanie podana ale nie bardzo całą formułę, zapisu - jeśli wiecie gdzie to też może być dobrze wyjasnione to po proszę 

function f(obj: { X: number }) {
  return obj.X;
}
// jaki tutaj typ jest przyjmowany?

rozumiem że { X: number} to jest typ obiektu obj, który jest obiektem z kluczem x - typu number? Czy jak?

bo równie dobrze, dlaczego skoro podawany do funkcji były typ enum nie mozna po prostu go okreslic? 

function f(obj: E) {
  return obj.X;
} // tak rozumiem nie mozna bo 

nie można tak, bo kompilator mimo iż metodą JIT to w procesie kompilacji nie wie co to za typ? Bo enum jest definiowany przez nas 

Dziękuje za informacje 

1
komentarz 8 stycznia 2022 przez edutomek Dyskutant (8,380 p.)

W życiu TS nie używałem, ale różne systemy typów bardzo mnie interesują i z ciekawości sprawdziłem ten pierwszy fragment kodu w kompilatorze online. Moje podejrzenia się sprawdziły.

Kompilator nie zwraca żadnych błędów - zapewne właśnie dlatego, że użyłeś typu any. (To trochę tak, jakbyś powiedział kompiltorowi: nie wtrącaj się, nie twoja sprawa.) Kod został więc przetłumaczony na JS. (Swoją drogą to komentarz w TS dokładnie o tym wspomina.)

Natomiast już próba uruchomienia kodu w JS kończy się błędem, bo np. odwołujesz się do nieistniejącej wartości obj.foo, oraz próbujesz wykonać obj jako funkcję, podczas gdy ten obiekt funkcją nie jest.

Trzeba zrozumieć jedno: TS (zakładam) dokonuje statycznej analizy kodu, w oparciu o informacje odnośnie typów, które mu przekażesz. Jeśli stwierdzasz, że coś jest typu any, to kompilacja (zapewne) przejdzie. Ale to nie oznacza, że ten kod jest poprawny.

komentarz 8 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

@edutomek, Twój komentarz z powodzeniem nadaje się na odpowiedź. :)

komentarz 8 stycznia 2022 przez Comandeer Guru (599,730 p.)

Rzeknę więcej: zgodnie, regulaminem forum powinien być odpowiedzią.

komentarz 8 stycznia 2022 przez edutomek Dyskutant (8,380 p.)
Może to i jest odpowiedź, ale częściowa - bo już o dwukropkach się nie wypowiadam (za mało czasu, żeby tak się wgłębiać w TS). Swoją drogą, to pytanie jest tak sformułowane, że to w zasadzie są cztery (?) pytania: jedno dotyczy tej kompilacji, na pozostałe odpowiedział @ScriptyChris.
komentarz 8 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Odpowiedź nie koniecznie musi rozwiązywać problem autora i nie musi też odnosić się do wszystkiego, o co pyta autor lub z czym ma problem (choć fajnie, gdyby tak było). Ważne jest, żeby odpowiedź przyczyniała się do rozwiązania problemu, a Twój komentarz to robi, ponieważ odpowiada na część pytań autora.

1 odpowiedź

+1 głos
odpowiedź 8 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

co tutaj robi operator ":" dwukorpka?

Określa typ dla rozpakowanego (destrukturyzowanego) obiektu { first, last = 'Smith' }.

rozumiem że { X: number} to jest typ obiektu obj, który jest obiektem z kluczem x - typu number?

Tak.

bo równie dobrze, dlaczego skoro podawany do funkcji były typ enum nie mozna po prostu go okreslic?

 

function f(obj: E) {

  return obj.X;

} // tak rozumiem nie mozna bo

nie można tak, bo kompilator mimo iż metodą JIT to w procesie kompilacji nie wie co to za typ? Bo enum jest definiowany przez nas

Enum jest przez TypeScript kompilowany do obiektu w JavaScript. Nie jest więc, jak większość typów, usuwany z kodu w trakcie kompilacji. Żeby użyć enuma jako typ, zastosuj operator typeof.

Przykład powyższego kodu z typem obiektowym i z enumem.

https://www.typescriptlang.org/play?#code/PTAEEMBsEtwZ1AFwJ4AcCuoAmlygPYBG0ApgNaLoBQKqJoAoqALygDeVoXoAGgFygAdugC2hEgCcA3FQC+VKgDN0ggMaJo+QaEUAKIgCsBDAJTsqAAosSSlCdsMA6HjPlUQHj+89fvoEsIiVAGijABM5tygAOQ80XIKymoaWjph+oRGSGgk+IrhoMAAVARYqgBeyIjggqTZGKDl-oF4RcBmHFE2dg6Zzq5AA

komentarz 8 stycznia 2022 przez PramatycznyJunior Początkujący (420 p.)

dziękuje serdecznie za odp, a swoją drogą jak zwracać wartość z takiej funkcji async? 
Bo generalnie próbuje na różne sposoy "resolve nie znajduje" then zwraca dalej obietnice? 

async function foo() {
   return 1 //chciałbym zwrócić to jeden.
}
var a = foo().then( () =>{  return;});
console.log( a) // dalej promise a nie działa resolve 

 

komentarz 8 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

W obecnej formie funkcja foo zwraca promise, który owija wartość 1. Żeby odczytać tą wartość, użyj then (tak jak masz teraz) i wtedy w przekazanym argumencie będziesz ją mieć:

foo().then((theValue) => {
  console.log('theValue:', theValue);
});

Alternatywnie (co często jest wygodniejsze w użyciu i łatwiejsze w czytaniu) możesz skorzystać ze słówka await:

var a = await foo();

, przy czym wtedy musisz albo ten kod wstawić do funkcji asynchronicznej (słówko async), albo całość musi być w global scope i cały skrypt musi być modułem - wtedy zadziała tzw. top-level await.

Warto wiedzieć, że jeśli już masz do czynienia z kodem asynchronicznym, to nie odczytasz zwracanych przez niego wartości bez użycia then lub await. Innymi słowy - jeśli już wejdziesz w kod asynchroniczny, to nie "wrócisz" do kodu synchronicznego.

komentarz 9 stycznia 2022 przez Wiciorny Ekspert (269,120 p.)
tak z zainteresowania do tematu, zapytam a w TypeScript- rozumiem nie idzie zwrócić wartośći z funkcji w takim trybie? Tylko odczytanie?
Bo np jeślibyśmy chcieli zwrócić wartość funkcji zamiast użycia console.loga w then ?
1
komentarz 9 stycznia 2022 przez ScriptyChris Mędrzec (190,190 p.)

TypeScript to nadzbiór dla JavaScript - coś co nie działa w JavaScript, nie zadziała również w TypeScript.

Z then można zwracać wartość, ale żeby ją odczytać trzeba znowu podpiąć się pod then (stworzyć łańcuch promisów) lub skorzystać z await, bo to ciągle jest kod asynchroniczny.

komentarz 10 stycznia 2022 przez Wiciorny Ekspert (269,120 p.)
dlatego piszę w Javie :D i wole analize danych

Podobne pytania

0 głosów
0 odpowiedzi 86 wizyt
pytanie zadane 19 października 2021 w SQL, bazy danych przez Misiek Mądrala (5,300 p.)
+2 głosów
2 odpowiedzi 514 wizyt
pytanie zadane 11 grudnia 2020 w C# przez Dziedzic Obywatel (1,180 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...