2012-10-13 16 views
88

Mam definicję klasy TypeScript, która zaczyna się tak;Używanie tablicy typów maszynowego TypeScript

module Entities {   

    export class Person { 
     private _name: string; 
     private _possessions: Thing[]; 
     private _mostPrecious: Thing; 

     constructor (name: string) { 
      this._name = name; 
      this._possessions = new Thing[100]; 
     } 

Wygląda jak tablica typu Thing nie jest poprawnie przetłumaczona na odpowiedni typ tablic JavaScript. Jest to urywek z wygenerowanym javascript:

function Person(name) { 
    this._name = name; 
    this._possessions = new Entities.Thing[100](); 
} 

kod zawierający obiekt Osoba prowadząca, wyjątek podczas próby zainicjowania pole _possession:

Error is "0x800a138f - Microsoft JScript runtime error: Unable to get value of the property '100': object is null or undefined".

Jeśli zmienić typ _possession do any[] i zainicjować _pojęcie z new Array() wyjątkiem nie jest zgłaszane. Przegapiłem coś?

Odpowiedz

104

masz błąd w składni tutaj:

this._possessions = new Thing[100](); 

ta nie tworzy „wachlarz rzeczy”. Aby utworzyć tablicę rzeczy, można po prostu użyć tablicy dosłowne wyrażenie:

this._possessions = []; 

konstruktora tablicy jeśli chcesz ustawić długość:

this._possessions = new Array(100); 

stworzyłem krótki przykład roboczy ty może spróbować w playground.

module Entities { 

    class Thing { 

    }   

    export class Person { 
     private _name: string; 
     private _possessions: Thing[]; 
     private _mostPrecious: Thing; 

     constructor (name: string) { 
      this._name = name; 
      this._possessions = []; 
      this._possessions.push(new Thing()) 
      this._possessions[100] = new Thing(); 
     } 
    } 
} 
+2

nie naprawia ona długości, ale raczej powinna wcześniej przyporządkować tablicę: – Sebastian

+0

dlaczego nie możesz zrobić "prywatnych _possessions: Thing []: []; 'w definicji klasy? – SuperUberDuper

8

Tłumaczenie jest prawidłowe, wpisanie wyrażenia nie jest prawidłowe. TypeScript nieprawidłowo wpisuje wyrażenie new Thing[100] jako tablicę. Powinien być błąd w indeksowaniu Thing, funkcji konstruktora, za pomocą operatora indeksu. W języku C# przydzieliłoby to tablicę 100 elementów. W JavaScript wywołuje to wartość na indeksie 100 z Thing tak, jakby był konstruktorem. Ponieważ wartości te wynoszą undefined, podnoszą wspomniany błąd. W JavaScript i TypeScript zamiast tego potrzebujesz new Array(100).

Powinieneś zgłosić to jako błąd w CodePlex.

+1

Nie chcę new Array (100). Chcę mieć wpisaną tablicę rzeczy. Nie wiem, czy to błąd, czy tylko moja błędna interpretacja specyfikacji dokumentu. –

44

Możesz spróbować jednego z nich. Nie dają mi błędów. Jest to sugerowana metoda z typescript for array declaration.

Korzystając z Array<Thing> korzysta z generycznych w maszynopisie. Jest to podobne do pytania o kod w kodzie List<T>.

// Declare with default value 
private _possessions: Array<Thing> = new Array<Thing>(); 
// or 
private _possessions: Array<Thing> = []; 
// or -> prefered by ts-lint 
private _possessions: Thing[] = []; 

lub

// declare 
private _possessions: Array<Thing>; 
// or -> preferd by ts-lint 
private _possessions: Thing[]; 

constructor(){ 
    //assign 
    this._possessions = new Array<Thing>(); 
    //or 
    this._possessions = []; 
} 
+2

Aby wstępnie przydzielić rozmiar, użyj 'nowej tablicy (100)'. –

+1

możesz również użyć ... [] – danday74

+0

@ danday74 - Zaktualizowałem, aby uwzględnić twoją metodę, jest to ustawienie domyślne podczas korzystania z polecenia ts-lint recomended/latest config. – Kieran

Powiązane problemy