2015-05-08 17 views
17

Używam TypeScript 1.4 w projekcie ASP.NET MVC 5.Data zmienna działa, ale funkcje na niej nie są

mam pole typu Data i działa częściowo:

var dob: Date = result.dateOfBirth; 
alert(dob); 
var dobAsString = dob.toDateString(); 

W powyższym kodzie, pierwsze dwie linie pracy, pokazując wartość jako „1968-11-16T00: 00: 00” , zgodnie z oczekiwaniami. Ale ostatnia linia nie działa, w rzeczywistości reszta kodu poniżej tej linii nie jest nawet wykonywana - po prostu się zrywa, bez komunikatu o błędzie.

To zachowanie nie ustąpi bez względu na to, która funkcja daty zostanie zastosowana w ostatnim wierszu; Mógłbym również użyć dob.getFullYear() itd. I za każdym razem zawodziłby. Jednak zmienna jest właściwego typu i ma odpowiednią wartość. Kompilator odnajduje także funkcje Date, kompiluje się bez żadnych problemów, ale w czasie wykonywania zawodzi. Jakieś pomysły?

+0

Przepraszam, poprawiłem to teraz. –

+0

To dziwny alarm - kiedy ostrzegam obiekt daty, widzę datę w zupełnie innym formacie, chociaż może to być związane z przeglądarką. Czy jesteś pewien, że 'result.dateOfBirth' jest tak naprawdę obiektem' Date', a nie ciągiem reprezentującym datę? Czy jest możliwe, że istnieje kod 'try/catch' wokół tego kodu, który po cichu połknął błąd? – DCoder

+0

Nie ma 'try/catch', a' dob' jest silnie wpisane jako 'Date'. –

Odpowiedz

20

Istnieją dwa aspekty tego. Po pierwsze, musisz przeanalizować datę, ponieważ obecnie masz ciąg znaków. Po drugie zmienna result nie zawiera informacji o typie.

var result = { 
    dateOfBirth: '1968-11-16T00:00:00' 
}; 

// Error, cannot convert string to date 
var a: Date = result.dateOfBirth; 

// Okay 
var b: Date = new Date(result.dateOfBirth); 

var result2: any = result; 

// Okay (not type information for result2) 
var c: Date = result2.dateOfBirth; 

Kiedy wrócisz wiadomość JSON można zastosować do niego interfejs, który opisuje co serwer musi wysłać, aby złapać problemów w kodzie maszynopis - taki jak ten, który znalazłeś. Spowoduje to zatrzymanie problemu występującego ponownie w przyszłości (chociaż nie sprawdza, czy dostarczony JSON pasuje do interfejsu) ... poniższy przykład zakłada, że ​​result ma obecnie typ.

interface NameYourResult { 
    dateOfBirth: string; 
} 

var r: NameYourResult = result; 
+0

Używałbyś interfejsu do opisu komunikatu JSON, więc tak - mógłbyś mieć błąd w definicji interfejsu, ale * tylko * tam (i nie zaśmiecony w całej bazie kodu). Używałbyś interfejsu, aby umożliwić TypeScriptowi zapewnienie kodu * przy użyciu * wiadomość nie popełniła błędu - nie sprawdzać poprawności odpowiedzi z serwera. tj. dostajesz 50% bezpieczeństwa typu za pomocą interfejsu, 0%, jeśli nie korzystasz z interfejsu. – Fenton

Powiązane problemy