同事遇到的 TypeScript 小問題一則,如下圖,Foo 與 Bar.Foo Module 裡都有個 IBlah Interface(不算良好的設計但合法,用在特定情境可簡化程式),在 Bar.Foo 內想引用更上層 Foo 的 IBlah,不管宣告型別是 IBlah 還是 Foo.IBlah,指向的都是 Bar.Foo.IBlah。

同樣的情境,在 C# 裡也會上演,在 Bar.Foo 命名空間內不管寫 Foo.IBlah 或 IBlah 指的都是Bar.Foo.IBlah:

C# 可用 global:: 關鍵字指定全域命名空間解決這個問題,寫成 global::Foo.IBlah 指明是上層 Foo 命名空間下的 IBlah。〔MSDN 文件舉了一個在自己程式中命名 System、Console 的牙給範例(揪竟是為了什麼要這樣苦苦相逼呢?),使用 global:: 也可輕巧解決〕。

跳一下,回到 TypeScript 案例。在 TypeScript 沒有 global:: 可用(Github 上有人提議,但尚未納入規格),我找到的解法是利用 import ExtFoo = Foo 為外層模組取別名,在 Bar.Foo 透過 ExtFoo.IBlah 解決問題。

module Foo {
    export interface IBlah {
        External: string;
    }
}
import ExtFoo = Foo;
module Bar {
    module Foo {
        export interface IBlah {
            Internal: string;
        }
    }
 
    var x: ExtFoo.IBlah = { External: "A" };
}

Comments

Be the first to post a comment

Post a comment