2016-11-22 47 views
2

如果我有一個文件myinterface.ts定義接口,而無需把它們導出

interface MyInterface { 
    foo() : string 
} 

和第二文件myimplementation.ts

class MyImplementation implements MyInterface { 
    ... 
} 

問題1:爲什麼這項工作?我沒有導出界面。

然後,如果我想改變foo() : stringfoo() : SomeType其中SomeType是另一個模塊中定義,我需要修改myinterface.ts是:

import { SomeType } form 'some-module'; 
interface MyInterface { 
    foo() : SomeType 
} 

這會導致錯誤的myimplementation.ts說「無法找到名字'MyInterface'「。

問題2:,當你添加一個進口(或出口)與當文件只包含接口* .ts文件改變了什麼樣的變化(和他們不甚至標記爲導出)。

我知道最好的做法是簡單地將我的界面標記爲導出並執行import {MyInterface} from 'myinterface';,但我試圖理解原始版本的工作原理以及影響。

+0

TS接口在生成可執行代碼的意義上並不是真實的,它們充當類型系統的合同並在輸出之前被丟棄。在這個意義上,它們很像'enum's。您不能導入或導出它們,因爲它們不存在。 – ssube

+0

我知道,不過從'some-module';'導入{SomeInterface}似乎是有效的,所以我想這是TSC的某種暗示。其實我很好奇使用不同文件中定義的接口。 – Kir

+0

@ssube這不完全正確。如果我將實現的接口更改爲'SomeUndefinedInterface',則會引發編譯器錯誤。這個接口必須在某個地方定義,我同意@Kir認爲它知道另一個文件中的定義沒有明確的導入是神祕的:「相反,要消費從一個導出的變量,函數,類,接口等不同的模塊,它必須使用其中一個導入表單導入,模塊是聲明性的;模塊之間的關係根據文件級別的導入和導出來指定。 Typescript手冊 – Orphid

回答

1

快速調查:

我有這樣的InterfaceFile.ts:

interface MyInterface { 
    foo(): string 
} 

var s = 4; 

而這在一個名爲ImplFile.ts

class MyImplementation implements MyInterface { 
    foo(): string { 
     return 'foo'; 
    } 
} 

s.toExponential(1); 

現在,當我看着編譯InterfaceFile.js我看到這個:

var s = 4; 

而ImplFile.ts中的s.toExponential(1)導致編譯器沒有問題(Webstorm將其作爲全局樣式)。

現在,如果我明確導出s;

interface MyInterface { 
    foo(): string 
} 

export var s = 4; 

我得到這個:

exports.s = 4; 

而且既不s也不MyInterface可沒有進口

所以,好像如果你沒有在文件中導出什麼,它被視爲一個全球性的。我懷疑如果導出任何內容,文件就會成爲一個模塊。

+0

上面的鏈接只是解釋'exports'是對'module exports'的引用,所以'exports = XXX'將不起作用。 – Kir

+0

@Kir你說得對,我想。我會編輯我的答案。 – Orphid

相關問題