2017-02-19 16 views
6

Próbowałem eksportować interfejs w NgModule-deklaracji i wywozu oraz uzyskiwanie ten błąd już w edytorze (Visual Code Studio): [ts] 'MyInterface' only refers to a type, but is being used as a value here.Interfejs nie może być eksportowany w kancie 2-kątowym?

Oto przykładowy kod Edit-1:

import { NgModule }   from '@angular/core'; 
import { CommonModule }  from '@angular/common'; 
import { FormsModule }  from '@angular/forms'; 
import { MaterialModule }  from '@angular/material'; 
import { MyInterface }  from './my.interface'; 
import { MyService }   from './my.service'; 

@NgModule({ 
    imports:  [ CommonModule, FormsModule, MaterialModule.forRoot() ], 
    declarations: [ MyInterface],//<- this is causing the message 
    exports:  [ MyInterface], 
    providers: [ MyService ] 
}) 
export class MyModule { } 

Jedna część objaśnienia znalazłem in the answer to this post: "ponieważ interfejsy są usuwane w środowisku wykonawczym w TypeScript". Obecnie refactoruję swoją aplikację do modułów funkcji, więc nie mogę jej teraz przetestować: Czy mogę używać interfejsów tylko po zaimportowaniu z "./mypathto/myinterfejsu"?

+0

Zamieść swój kod. eksportowanie i importowanie interfejsów działa tutaj dobrze. –

+1

Gdzie chcesz go użyć? Jako dostawca? "Próbowałem wyeksportować interfejs w deklaracji NgModule" co masz na myśli? – yurzui

+1

Zapoznaj się z dokumentacją https://angular.io/docs/ts/latest/guide/dependency-injection.html#!# maszynopis-interfejsy-aren-t-valid-tokens – yurzui

Odpowiedz

13

Nie można wyeksportować interfejsu. Można tylko eksport:

  1. Inne moduły
  2. Komponenty
  3. Dyrektywy
  4. Rury

NgModule jest kanciasty pojęcie i nie powinny być mylone z modułem maszynopis. Aby umożliwić stronom trzecim, które używają Twojego modułu, możliwość korzystania z interfejsu, powinieneś utworzyć plik definicji z .d.ts.

Jeśli chcesz użyć interfejsu wewnątrz innego NgModule twój, należy po prostu użyć:

import {InterfaceName} from 'path/to/ngmodule/to/interface'; 

Ponadto, nie należy umieszczać interfejs w tablicy deklaracji, to stosuje się tylko do rur/elementów/dyrektywy.

Jeśli chcesz, aby interfejs być użyteczny poza biblioteką, należy dodać go do eksportu swojej index.ts:

export {InterfaceName} from 'path/to/ngmodule/to/interface'; 
+0

Dziękuję PierreDuc za "kompletną odpowiedź", która wyjaśnia dużo. Znalazłem [tę dokumentację na .d.ts] (https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html). – Myonara

3

No faktycznie można wyeksportować interfejs, ale nie w taki sposób próbujesz do zrobienia.

najpierw wygenerować interfaces.ts plik wpisując

ng g interface <interface_name>

Przykład pliku interfejs:

export interface Auction{ $key?:string; $auctioneer:string; ... } 
export interface Item{ $key?:string; condition?:string; description?:string; ...} 
export interface Bid{ $key?:string; amount:number; auction:string; ...} 

Po zmodyfikowaniu pliku do własnych potrzeb można importować tylko jeden, wszystkie lub wybrane interfejsy tak:

import { Auction } from './interfaces'; 

lub

import * as interfaces from './interfaces'; 
// then you have to call interfaces.Auction 

Jeśli za przypadkiem wiesz, jak udostępniać interfejsy globalnie. daj mi znać: Angular how to share interfaces across the app

Powiązane problemy