2017-02-21 19 views
0

У меня возникла проблема с пониманием того, как создавать два файла с одним и тем же пространством имен и импортировать их в другое в TypScript.Как правильно импортировать одно и то же пространство имен в двух разных файлах в Typcript

Это ситуация:

file1.ts

export namespace nspace { 
    export class ClassA { 

    } 
} 

file2.ts

import {nspace} from './file1'; 

export namespace nspace { 
    export class ClassB extends nspace.ClassA { 
     private z: nspace.ClassA; 
    } 
} 

внутри file2 я есть эти ошибки:

1) Индивидуальные декларации в объединенное декларация 'nspace' должна быть экспортирована или все локально

2) Свойство «ClassA» не существует на типе «TYPEOF N-Space»

На вершине, что, ClassA правильно найден, когда используются для объявления типа z поля (это даже приводит меня к правильному файлу если я использую «перейти к декларации» в моей IDE)
Я попытался найти первую ошибку в Интернете, потому что я действительно не понимаю, что это значит, но ни одна из найденных мной страниц не помогла. Я прочитал документацию о слиянии декларации в машинописном машинописном деле, но я не смог найти ситуацию, похожую на мою.
Не знаю, если это поможет, но я использую SystemJS в своей заявке

ответ

0

Видимо, дает другое имя при импортировании работал:

file1

export namespace nspace { 
    export class ClassA { 

    } 
} 

file2

import * as a from './file1'; 

export namespace nspace { 
    export class ClassB extends a.nspace.ClassA { 
     private b: a.nspace.ClassA; 

    } 
} 
0

Это должно быть много проще в использовании:

ClassA.ts
namespace MyApp { 
    export class ClassA { 
     public a: string = "classA"; 
    } 
} 
ClassB.ts
namespace MyApp { 
    export class ClassB extends ClassA { 
     private class_a: ClassA = new ClassA(); 
     private b: string = "classB"; 
    } 
} 
main.ts
namespace MyApp { 
    var b = new ClassB(); 
    console.log(b.class_a.a) // "classA" 
} 

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

Это может быть необходимо добавить ссылку на вершину ClassB.ts файл как таковые: /// <reference path="ClassA.ts" />

Хотя в моей установке, я не должен был сделать это, компилятор, кажется, забрать вещи правильно. (Я использую один Outfile и директиву исключающих tsconfig.json)

Sidenote:

Что я нахожу странным в том, что вы вынуждены экспортировать ClassA для того, чтобы быть обнаруженным в моем ClassB.ts. Кажется невозможным сохранить ClassA и ClassB в пространстве имен, если я хочу использовать их в Main.ts (даже в частных переменных). Это просто ошибки с «Не могу найти имя ..."

+0

Насколько я видел, что это обычная практика при использовании SystemJS, вам нужно чтобы импортировать все, что вам нужно в ваши файлы. Или я использую это неправильно? Он всегда работал так для меня – valepu

+1

Я действительно очень хорошо знаком с SystemJS - но AFAIK, если ваш 'tsconf ig.json' установлен правильно (используя '' module ":" system "'), в результате файл javascript должен иметь правильные операторы импорта SystemJS. Создайте свой тип машинописного текста и пусть компилятор обрабатывает среду. Попробуйте и взгляните на то, что набирает текст для вас! –

+0

У моего tsconfig.json есть «модуль: система», но если я не импортирую все, что я собираюсь использовать в определенном файле, он терпит неудачу, когда я открываю приложение в браузере. Может быть, потому что, как глоток обрабатывает компиляцию? (начинается с index.ts и перемещает импорт). Я использую это как начальный проект: https://github.com/FountainJS/generator-fountain-angular1 – valepu

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

  • Нет связанных вопросов^_^