2016-12-05 24 views
2

假設我有兩個文件,A.js和B.js。兩者都需要這樣的引用。從模塊導入唯一的類型信息

A.js

import { B } from "b" 

export class A { 
    constructor(public name: string) {} 
} 

let b = new B(); 
b.print(new A("This is a random name")); 

B.js

import { A } from "a" 

export class B { 
    print(a: A) { 
    console.log(a.name); 
    } 
} 

上面的例子將創建一個循環引用目前不我使用JavaScript運行工作。文件B.js確實只需要類型信息,而不是實際的導出對象)。我想從A.js獲得靜態類型檢查。這可能嗎?

+0

難道你不能只是''A類'移動到不同的文件,並且當你想要做'b.print(...)'時都導入它們? – Aurora0001

+0

或更好,但只是爲B放置在不同文件中的界面,並讓其他文件都使用該界面。 – toskv

+0

這就是循環依賴的定義。你只需要打破這個依賴......沒有理由爲什麼'A'需要引用'B'。將其餘的代碼移到其他地方。 –

回答

2

你不需要做什麼特別的只導入類型信息從模塊a

打字稿會爲你做它 - 如果唯一模塊b需要形式a是類型信息,編譯的文件b.js不會有require("./a")聲明,也就是說,它不會對a運行時的依賴。從typescript handbook引用:

編譯器檢測是否在發射的 JavaScript中使用了每個模塊。如果模塊標識符僅作爲 註釋類型的一部分使用,且不作爲表達式使用,則不需要調用 爲該模塊發射。

我只是去嘗試:

文件a.ts

import { B } from "./b" 

export class A { 
    constructor(public name: string) {} 
} 

let b = new B(); 
b.print(new A("This is a random name")); 

文件b.ts

import { A } from './a'; 

export class B { 
    print(a: A) { 
     console.log(a.name); 
    } 
} 

編譯在一起

tsc a.ts b.ts 

這裏是結果b。js

"use strict"; 
var B = (function() { 
    function B() { 
    } 
    B.prototype.print = function (a) { 
     console.log(a.name); 
    }; 
    return B; 
}()); 
exports.B = B; 

看到了嗎?沒有require("./a"),不像a.js包含

var b_1 = require("./b"); 

最有可能的,你在你的問題張貼的示例代碼是不完整的,真實的b模塊在a運行時的依賴 - 找出它是和擺脫那,你不會有這個問題。

+0

很好的回答!我完全錯過了這個,謝謝你讓我知道!你是對的,因爲我的例子太簡單了,不適合我的「真正」問題。 – jnsmalm

0

你在這裏使用了[typescript]標籤,所以我打算假設你使用的是打字稿。

使它成爲一條單行道。消除循環依賴。我可能會把它移到1個文件中,但是你仍然可以像這樣分割它。

a.ts(只是一個接口)

export interface A { 
    name: string; 
    new (name: string); 
} 

b.ts(實現)

import { A } from 'a'; 

export class B implements A { 
    /*...*/ 
} 
+0

我確實可以將類移動到其他文件(或進行其他重構)以解決問題,但這不是本例中的問題。 – jnsmalm