Typescript 导入模块会中断类型上不存在具有属性的本地类型
我有一个名为Typescript 导入模块会中断类型上不存在具有属性的本地类型,typescript,Typescript,我有一个名为CarType的枚举,它位于名为CarType.ts的文件中。代码如下: namespace MyProduct.Search { export enum CarType { Sedan = 0, Wagon = 1, Cabrio = 2, /* etc */ } } 在同一目录中名为SearchMain.ts的另一个文件中,我有以下代码: /// <reference path="../../
CarType
的枚举,它位于名为CarType.ts
的文件中。代码如下:
namespace MyProduct.Search {
export enum CarType {
Sedan = 0,
Wagon = 1,
Cabrio = 2,
/* etc */
}
}
在同一目录中名为SearchMain.ts
的另一个文件中,我有以下代码:
/// <reference path="../../d.ts/jquery.d.ts" />
/// <reference path="../../d.ts/knockout.d.ts" />
/// <reference path="../../d.ts/fullcalendar.d.ts" />
namespace MyProduct.Search {
export module SearchMain {
export function Init() {
/* snip */
let type: CarType = CarType.Sedan;
}
/* snip */
}
}
CarType变得不可用。Intellisense错误是类型“typeof Search”上不存在属性“CarType”
如何将来自完整日历的EventObjectInput与我的代码一起使用?这是一个令人困惑的问题: Typescript具有内部模块或名称空间,由关键字
名称空间
和模块
标识这两个关键字的含义相同。这是令人困惑的部分,因为module
实际上并不意味着JS模块。
名称空间基本上只是实现“显示模块模式”的语法糖。这是我们在javascript中使用实际模块之前所做的事情,不鼓励使用它
我建议查看Typescript,了解名称空间关键字在传输到javascript时的实际作用
基本上,namespace
只创建一个对象,您可以在其中控制对象外部看到的内容。另一个属性是,如果您有两个名称空间声明,并且在同一作用域上具有相同的名称,则会合并这些声明。
但最终,它被实现为传输javascript中的另一个变量
Typescript还有“真实”模块,也称为外部模块。真正的模块意味着它们是隔离的,您需要某种机制在运行时加载它们。它可以是webpack或browserify,如果您的代码要在node.js中运行,它可以是require
函数,也可以是reuqire.js库,但您需要一些东西
任何具有顶级导出
或导入
语句的文件都是一个模块。(命名空间内的导出不是顶级的!)
因此,我们有两个选择:
1.文件不是模块。
2.文件是一个模块
如果文件不是模块,则文件中声明的每个变量/类型都在全局范围内声明
如果文件是一个模块,则每个变量/类型的作用域仅限于该文件
因此,一旦您添加:
从'fullcalendar/src/types/input types'导入{EventObjectInput}代码>
您已将SearchMain.ts
转换为外部模块。现在SearchMain.ts
中的名称空间MyProduct.Search
被隔离,定义在与CarType.ts
中定义的范围不同的范围内。所以你得到了你的错误
TL;博士-你能做什么
混合使用内部模块和外部模块非常烦人。挑一个。
强烈建议只使用外部模块。不要使用名称空间,只使用导入和导出语句。迁移代码可能需要一段时间,但这是值得的
另一个选项是继续使用名称空间
。不要导入
事件对象导入
。使它在其他命名空间上可用。但同样,这是不推荐的
import { EventObjectInput } from 'fullcalendar/src/types/input-types';