TypeScript命名空间跨文件合并

时间:2016-09-12 13:06:50

标签: javascript typescript visual-studio-2015

我遇到了跨文件获取命名空间以解决和正确编译的问题。根据{{​​3}}和此documentation,以下内容不会产生任何问题:

App.Core.ts

namespace App.Core {
    export function createElem(tagName: string): JQuery {
        return $(document.createElement(tagName));
    }
}

App.Core.SubModule.ts

/// <reference path="App.Core.ts" />
namespace App.Core.SubModule {
    export function Test(): JQuery {
        return App.Core.createElem("div");
}

但是,Visual Studio在App.Core.SubModule.Test函数调用中给出了一个错误,指出Property 'createElem' does not exist on type 'typeof Core'我的理解是,如果命名空间跨多个文件,TS编译器将自动解析这些命名空间。看起来相应的JavaScript是正确的,但是缺少intellisense(以及红色波浪线错误行)非常令人沮丧,让我第二次猜到我在写什么。

这是我的文件设置,TS编译器,还是Visual Studio 2015显然已经破坏的TypeScript intellisense功能的问题?

2 个答案:

答案 0 :(得分:6)

  

Visual Studio在App.Core.SubModule.Test中的函数调用上给出了一个错误,声明属性'typeof Core'上不存在属性'createElem'

怀疑您在其中一个文件中有根级别importexport使文件成为模块并将其与全局名称空间断开连接。

快速修复

删除导入/导出,但要注意它可能会导致更多问题https://basarat.gitbooks.io/typescript/content/docs/tips/outFile.html

正确修复

不要使用命名空间。只需使用模块:https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

答案 1 :(得分:0)

文件 A

namespace A {
  export type User = {
    name: string,
    age: number
  }
}

文件 B

namespace A {
  export type Goods = {
    city: string,
    price: number
  }
}

文件 C - 在此处合并命名空间

declare module 'Final' {
  import 'namespace-b';
  import 'namespace-a';
}

文件 index.ts

import './namespace-final;';

function multipleNamespaces() {
  let user: A.User | A.Goods | undefined;
  user = { name: '', age: 0 }; // valid
  user = {city: 'beijing', price: 100} // vlaid
  user = 'test' // invalid
}