TypeScript: tworzenie pustej tablicy kontenerów o określonym typie


185

Tworzę prostą grę logiczną o nazwie „Three of a Crime” w języku TypeScript.

Próbując wstępnie przydzieloną tablicę w TypeScript, próbowałem zrobić coś takiego:

var arr = Criminal[];

co spowodowało błąd „Sprawdź format wyrażenia”.

też próbowałem to zrobić

var arr : Criminal = [];

a ten wyprodukowany „nie może przekształcić żadnego [] w„ przestępczy ”

jak można to zrobić za pomocą „TypeScript”?

Odpowiedzi:


169

W istniejących odpowiedziach brakowało opcji, więc oto pełna lista:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Jawne określenie typu jest ogólnym rozwiązaniem w przypadku niepowodzenia wnioskowania o typie dla deklaracji zmiennej.

  2. Zaleta używania potwierdzenia typu (czasami nazywanego rzutowaniem, ale tak naprawdę nie jest rzutowaniem w języku TypeScript) działa dla każdego wyrażenia, więc można go używać nawet wtedy, gdy nie jest zadeklarowana żadna zmienna. Istnieją dwie składnie dla asercji typu, ale tylko ta ostatnia będzie działać w połączeniu z JSX, jeśli Ci na tym zależy.

  3. Używanie konstruktora Array jest czymś, co pomoże ci tylko w tym konkretnym przypadku użycia, ale osobiście uważam go za najbardziej czytelny. Jednak w czasie wykonywania * występuje niewielki wpływ na wydajność . Ponadto, jeśli ktoś byłby na tyle szalony, aby przedefiniować konstruktora Array, znaczenie mogłoby się zmienić .

To kwestia osobistych preferencji, ale trzecia opcja jest dla mnie najbardziej czytelna. W zdecydowanej większości przypadków wymienione wady byłyby nieistotne, a czytelność jest najważniejszym czynnikiem.

*: Śmieszny fakt; w chwili pisania tego tekstu różnica w wydajności wynosiła 60% w przeglądarce Chrome, podczas gdy w przeglądarce Firefox nie było mierzalnej różnicy w wydajności.


60% ?? : O To dzikie
Max Coplan

239

Problem z poprawnym wstępnym przydzieleniem tablicy wpisanej w TypeScript był nieco zasłonięty ze względu na składnię literału tablicowego, więc nie był tak intuicyjny, jak początkowo sądziłem.

Właściwy sposób byłby

var arr : Criminal[] = [];

To da ci poprawnie wpisaną, pustą tablicę przechowywaną w zmiennej 'arr'

Mam nadzieję, że to pomoże innym!


20

Wiem, że to stare pytanie, ale ostatnio spotkałem się z podobnym problemem, którego nie można rozwiązać w ten sposób, ponieważ musiałem zwrócić pustą tablicę określonego typu.

miałem

return [];

gdzie []był Criminal[]typ.

Ani return: Criminal[] [];nie return []: Criminal[];pracował dla mnie.

Na pierwszy rzut oka mogę rozwiązać go poprzez stworzenie wpisywanych zmiennej (jak masz prawidłowo zgłoszone) tuż przed wpuszczeniem go, ale (nie wiem jak silniki JavaScript pracy) może tworzyć napowietrznych i to jest mniej czytelny.

Dla dokładności podam również to rozwiązanie w mojej odpowiedzi:

let temp: Criminal[] = [];
return temp;

W końcu znalazłem rzutowanie typu TypeScript, co pozwoliło mi rozwiązać problem w bardziej zwięzły i czytelny (i być może efektywny) sposób:

return <Criminal[]>[];

Mam nadzieję, że pomoże to przyszłym czytelnikom!


1

Do publicznego dostępu użyj jak poniżej:

public arr: Criminal[] = [];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.