我遇到了跨文件获取命名空间以解决和正确编译的问题。根据{{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功能的问题?
答案 0 :(得分:6)
Visual Studio在App.Core.SubModule.Test中的函数调用上给出了一个错误,声明属性'typeof Core'上不存在属性'createElem'
怀疑您在其中一个文件中有根级别import
或export
。 使文件成为模块并将其与全局名称空间断开连接。
删除导入/导出,但要注意它可能会导致更多问题https://basarat.gitbooks.io/typescript/content/docs/tips/outFile.html
不要使用命名空间。只需使用模块:https://basarat.gitbooks.io/typescript/content/docs/project/modules.html
答案 1 :(得分:0)
namespace A {
export type User = {
name: string,
age: number
}
}
namespace A {
export type Goods = {
city: string,
price: number
}
}
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
}