2013-03-21 11 views
9

Istnieją dwa maszynopis pliki:Rodzaj odniesienia bez pełnej nazw

A.ts: 

export class Person { 
    public name:string; 
    constructor(){} 
} 

i

B.ts: 

import A = module("A"); 
var p: A.Person; 

tej pory wszystko działa bez zarzutu.

Jednak, gdy próbuję zrobić skrót do nazwy typu sprowadzane z A.ts:

var Person = A.Person; 
var pp: Person; 

kompilator narzeka (w wierszu: „var str: Osoba”):

nazwa 'osoba' nie istnieje w bieżącym zakresie

Jak mogę osiągnąć tę lub podobną składnię, aby uniknąć długich przestrzeni nazw?

+0

Nie wiem, jak osiągnąć to, co próbujesz zrobić, jednak problemem, z którym masz do czynienia ze stenogramem, jest to, że osoba nie jest typem TypeScript, ale odniesieniem do klasy. Dlatego zamiast pisać 'var pp: Person;' możesz użyć 'var pp = new Person();' – thomaux

+0

Tak, mogę utworzyć instancję klasy, ale nie mogę zadeklarować zmiennej klasy. Kompilator będzie mógł określić typ zmiennej w jednym przypadku i nie będzie mógł tego zrobić w drugim. Wydaje mi się, że jest to błąd w kompilatorze. W każdym razie drugi przykład ("var pp = new Person();") działa. Dzięki. – ads

Odpowiedz

6

W TypeScript adnotacja typu musi odnosić się do typu znanego kompilatorowi. Nie możesz po prostu używać zmiennych jako typów. Alias ​​dajesz do modułu jest jednym podać w sprawozdaniu import - tak można alias od dłuższego nazw do krótkiego aliasu tutaj:

import alias = module("My/Long/Module/Path"); 

Ale zrobić następnie użyć aliasu.

Aby uzyskać wynik, którego szukasz, trzeba by użyć nieco szalony klasę lokalnego rozszerzenie metody klasy moduł:

import myModule = module("MyModule"); 

class Person extends myModule.Person { 
} 

var x: Person; 
+0

Rozszerzanie klasy to trochę za dużo dla moich celów. Będę trzymać się pseudonimu. Dzięki. – ads

2

Myślę, że błąd jaki powinien get to „typ nie zdefiniowany "Obecnie błąd jest" Nazwa nie istnieje w bieżącym zakresie ". Jest to spowodowane oddzielnymi przestrzeniami deklaracji dla zmiennych i typów. Zmienna nie może być odwoływana w sekcji nazwy typu.

Widać to w prostym przypadku pojedynczego pliku tutaj:

module M 
{ 
    export interface P {} 
} 

import im = M; 
var foo1:im.P; // Okay 

var vm = M; 
var foo2:vm.P; // Error 

rozwiązanie jednak zmniejszyć liczbę liter jest dziedziczenie jako Steve wspomniał.

Powiązane problemy