2013-03-21 12 views
9

ci sono due file dattiloscritto:Tipo di riferimento senza la piena namespace

A.ts: 

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

e

B.ts: 

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

Finora tutto funziona bene.

Tuttavia, quando cerco di fare una scorciatoia per il nome del tipo importato dai A.ts:

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

il compilatore si lamenta (sulla linea: "var pp: Persona"):

il nome 'persona' non esiste nell'ambito corrente

Come posso ottenere questa o una sintassi simile, per evitare lunghi spazi dei nomi?

+0

Non so come ottenere ciò che si sta tentando di fare, tuttavia il problema che si ottiene con la notazione abbreviata è che Person non è un tipo TypeScript ma un riferimento a una classe. Quindi, invece di scrivere 'var pp: Person;' potresti usare 'var pp = new Person();' – thomaux

+0

Quindi, posso creare un'istanza della classe ma non posso dichiarare una variabile della classe. Il compilatore sarà in grado di dedurre il tipo per la variabile in un caso e incapace di farlo nell'altro. Mi sembra un bug nel compilatore. Ad ogni modo il secondo esempio ('var pp = new Person();') funziona. Grazie. – ads

risposta

6

In TypeScript, l'annotazione del tipo deve riguardare un tipo noto al compilatore. Non puoi semplicemente usare le variabili come tipi. L'alias si dà ad un modulo è quello specificato nella dichiarazione import - in modo da poter alias da un lungo spazio dei nomi a breve alias qui:

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

Ma si fare quindi necessario utilizzare l'alias.

Per ottenere il risultato che si sta cercando, si dovrebbe utilizzare la classe locale un po 'folle che si estende il metodo della classe del modulo:

import myModule = module("MyModule"); 

class Person extends myModule.Person { 
} 

var x: Person; 
+0

Estendere la lezione è un po 'troppo per i miei scopi. Attaccherò con alias. Grazie. – ads

2

Penso che l'errore che dovrebbe get è "Type non definito "Tuttavia attualmente l'errore è" Il nome non esiste nell'ambito corrente ". È a causa di spazi di dichiarazione separati per variabili e tipi. Una variabile non può essere referenziata in una sezione del nome del tipo.

Si può vedere in un semplice caso singolo file qui:

module M 
{ 
    export interface P {} 
} 

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

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

Tuttavia la soluzione per ridurre il numero di lettere è eredità di Steve menzionato.

Problemi correlati