2013-04-05 13 views
63

Tworzę prostą grę logiczną o nazwie "Three of a Crime" w TypeScript.TypeScript: Tworzenie pustej tablicy typów maszynowych

Gdy próbuje wstępnie przyznane wpisane tablicę w maszynopisie, próbowałem zrobić coś takiego:

var arr = Criminal[]; 

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

Próbowałem też robić to

var arr : Criminal = []; 

i ten produkowany „nie można przekonwertować dowolny [] do 'Criminal'

jaka jest droga do 'maszynopis' to zrobić?

Odpowiedz

111

Kwestia poprawnie pre-alokacja tablicy maszynowej w TypeScripcie była nieco zaciemniona z powodu składni literalnej, więc nie była tak intuicyjna, jak początkowo sądziłem,

Prawidłowy sposób byłoby

var arr : Criminal[] = []; 

To daje poprawnie wpisane, pustą tablicę przechowywaną w zmiennej „arr”

nadzieję, że pomaga innym!

12

Wiem, że to stare pytanie, ale ostatnio stanąłem przed podobnym problemem, który nie mógł zostać rozwiązany w ten sposób, ponieważ musiałem zwrócić pustą tablicę określonego typu.

miałem

return []; 

gdzie [] był Criminal[] typu.

Dla mnie nie pracował return: Criminal[] []; ani return []: Criminal[];.

Na pierwszy rzut oka rozwiązałem go, tworząc wpisaną zmienną (jako poprawnie zgłoszoną you) tuż przed jego zwróceniem, ale (nie wiem, jak działają silniki JavaScript), może on generować narzut i jest mniej czytelny.

Dla dokładności będę zgłosić to rozwiązanie w mojej odpowiedzi TOO:

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

końcu znalazłem maszynopis typu odlewów, co pozwoliło mi rozwiązać ten problem w sposób bardziej zwięzły i czytelny (a może skuteczny) sposób :

return <Criminal[]>[]; 

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

+5

'[] jako Criminal []' działa również. –

30

Istniejące odpowiedzi brakowało opcję, tak 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. Jednoznaczne określenie rodzaju jest ogólnie rozwiązanie, gdy typ wnioskowanie nie dla deklaracji zmiennej.

  2. Zaletą korzystania z type assertion (czasami nazywanej rzutem, ale tak naprawdę nie jest to rzutowanie w języku TypeScript) działa dla dowolnego wyrażenia, więc można go używać nawet wtedy, gdy nie zadeklarowano żadnej zmiennej. Istnieją dwie składnie dla asercji typu, ale tylko ta ostatnia będzie działała w połączeniu z JSX, jeśli się o to zatroszczysz.

  3. Korzystanie z konstruktora Array jest pomocne w tym przypadku, ale ja osobiście uważam, że jest on najbardziej czytelny. W środowisku wykonawczym występuje jednak niewielka wartość: performance impact. Ponadto, jeśli ktoś był na tyle szalony, aby na nowo zdefiniować konstruktora Array, the meaning could change.

Jest to kwestia osobistych preferencji, ale trzecia opcja jest najbardziej czytelna. W przeważającej większości przypadków wspomniane wady byłyby nieistotne, a czytelność jest najważniejszym czynnikiem.

*: Zabawny fakt; w momencie pisania różnica w wydajności wynosiła 60% w Chrome, podczas gdy w Firefoksie nie było mierzalnej różnicy w wydajności.

Powiązane problemy