2013-03-21 3 views
9

Есть два машинопись файлов:Тип ссылка без полного пространства имен

A.ts: 

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

и

B.ts: 

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

До сих пор все работает отлично.

Однако, когда я пытаюсь сделать ярлык для имени типа импортируемого из A.ts:

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

компилятор жалуется (на линии: «вар стр: Person»):

название 'лицо' не существует в текущей области

Как я могу достичь этого или подобного синтаксиса, чтобы избежать длинных пространств имен?

+0

Я не знаю, как добиться того, что вы пытаетесь сделать, однако проблема, с которой вы сталкиваетесь в своей короткой нотации, заключается в том, что Person не является типом TypeScript, а ссылкой на класс. Следовательно, вместо записи 'var pp: Person;' вы могли бы использовать var var = new Person(); ' – thomaux

+0

Итак, я могу создать экземпляр класса, но я не могу объявить переменную класса. Компилятор сможет вывести тип переменной в одном случае и не сможет сделать это в другом. Мне кажется, ошибка в компиляторе. Во всяком случае, второй пример («var pp = new Person();») работает. Благодарю. – ads

ответ

6

В TypeScript аннотация типа должна относиться к типу, известному компилятору. Вы не можете просто использовать переменные как типы. Псевдоним вы даете модуль, который вы укажете в import заявления - так что вы можете псевдоним от длинного пространства имен в короткий псевдоним здесь:

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

Но вы сделать затем использовать псевдоним.

Чтобы получить результат, который вы ищете, вы должны использовать немного сумасшедший местный класс, расширяющий метод класса модуля:

import myModule = module("MyModule"); 

class Person extends myModule.Person { 
} 

var x: Person; 
+0

Расширение класса слишком много для моих целей. Я буду придерживаться псевдонима. Благодарю. – ads

2

Я думаю, что ошибка, которую вы должны прибудете является «Тип не определено ". В настоящее время ошибка« Имя не существует в текущей области ». Это связано с отдельными пространствами объявлений для переменных и типов. Переменная не может быть указана в разделе имени типа.

Вы можете увидеть его в простом одном файле случае здесь:

module M 
{ 
    export interface P {} 
} 

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

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

Однако решение уменьшить количество писем наследования как упоминалось Стив.

Смежные вопросы