2016-01-15 25 views
15

TypeScript, tür bildirimleri sırasına göre hassas mı?TypeScript'teki Tür Beyanı Sırası Siparişi

angular2-polyfills.js:138 Error: Cannot read property 'prototype' of undefined(…)

: tip sırasını değiştirme

(AFAIK) typescript kendisi (bu hata bana alakasız & kadar garip görünüyor bu yüzden) kullanılarak uygulanır Açısal 2 (beta.0) içinde bir hataya neden oluyor biz müşteri tarafında, söz hatayı bkz

export class AuthResponse extends JsonResponse { } 
export class JsonResponse { 
    public code: ResultCode; 
} 
export enum ResultCode { } 

uygulamayı başlatma:

bir dosyayı t1.ts var varsayalım. Ancak, bu dosyadaki bildirimlerin sırasını tersine çevirirsek, hata gider (Sadece kayıt için, şu an ilerliyorum, bunu aklımda tutarak & çalışır).

beş fazla dosya ihtiyaç bu hatayı yeniden oluşturmak için:

t2.ts:

import {AuthResponse, JsonResponse, ResultCode} from './t1'; // this order? 

export class DummyAction { 
    doSomething() { 
     console.log('test, starting ...'); 

     var v = new AuthResponse(); 
     return v; 
    } 
} 

app.component.ts:

import {Component, OnInit} from 'angular2/core'; 
import {DummyAction} from './components/t2';    

@Component({  
    selector: 'root-app', 
    templateUrl: '/app/templates/app.html', 
}) 
export class AppComponent implements OnInit { 
    constructor() { 
     var tester = new DummyAction(); 
     // tester.runTest(); 
    } 

    ngOnInit() { } 
} 

app.html:

<h1>TEST</h1> 

boot.ts: biraz daha büyük ama esasen, angular web sitesinde öğreticisindeki index.html yapısını sahiptir

import {bootstrap} from 'angular2/platform/browser'; 
import {AppComponent} from './app.component'; 

bootstrap(AppComponent, []); 

Ve index.html.

+1

Sorunu sağlanan kodu kullanarak yeniden ürettim. –

cevap

10

TypeScript kendisi hassas değil, ancak bu JS'ye derlendi. JS

class A extends B {} 
class B {} 

:

var A = (function (_super) { /* ... */ })(B); 
var B = (function() { /* ... */ })(); 

B hattı 1. Doğru biridir gibi vasa_c cevap Oyumu dökme gelmiş

+3

TypeScript, bildirim sırasına duyarlı değildir, ancak * neden hala bu JavaScript kodunu çıkarmayı seçiyor?Bundan daha iyi bilmeli. Burada neyi özlüyorum? – stakx

+0

"TypeScript kendisi hassas değil, ancak bu JS'ye derlendi." Ne anlama geliyor? tsc uyumlu değil mi? –

7

üzerinde tanımlanmamış. Aşağıda bu konuyla ilgili daha fazla bilgi vermek istiyorum, bu yüzden OP'nin sorunu anlaması daha kolay olacaktır.

biz örnek kod olacaksa:

export class AuthResponse extends JsonResponse { } 
export class JsonResponse { 
    public code: ResultCode; 
} 
export enum ResultCode { } 

Ve derlemek - bu sonuç nasıl olacak budur:

var AuthResponse = (function (_super) { 
    __extends(AuthResponse, _super); 
    function AuthResponse() { 
     _super.apply(this, arguments); 
    } 
    return AuthResponse; 
})(JsonResponse); 
exports.AuthResponse = AuthResponse; 
var JsonResponse = (function() { 
    function JsonResponse() { 
    } 
    return JsonResponse; 
})(); 
exports.JsonResponse = JsonResponse; 
(function (ResultCode) { 
})(exports.ResultCode || (exports.ResultCode = {})); 
var ResultCode = exports.ResultCode; 

Not çıkan kodu olduğunu sadece tanımları çalışmıyor . Fonksiyonlar ve değişkenler. Bu tüm farkı yaratır. Çünkü hem açıklamalarınız hem de ifadeleriniz var. Bu konuyla ilgili daha fazla bilgi ve js düzenindeki ifadeler, bu mükemmel yayında okuyabileceğiniz önemli bir yazıdır: JavaScript function declaration and evaluation order