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';