导入声明的TypeScript问题

时间:2015-11-19 11:22:53

标签: typescript

我遇到从扩展文件导入声明的问题(我正在使用this输入)。根据{{​​3}},我应该把它放到我的代码中:

import * as SockJS from 'sockjs-client';
import BaseEvent = __SockJSClient.BaseEvent;
import SockJSClass = __SockJSClient.SockJSClass;

但是,当我尝试按照以下方式执行此操作时:

module Test {
    import * as SockJS from 'sockjs-client';
    import BaseEvent = __SockJSClient.BaseEvent;
    import SockJSClass = __SockJSClient.SockJSClass;

    export class Example {
        constructor() {......
}}}

我从编译器中收到以下错误:

error TS1147: Import declarations in a namespace cannot reference a module.

我做错了吗?或者打字本身有什么问题吗?

感谢
uksz

4 个答案:

答案 0 :(得分:11)

您应该在模块外使用导入语句

import * as SockJS from 'sockjs-client';
import BaseEvent = __SockJSClient.BaseEvent;
import SockJSClass = __SockJSClient.SockJSClass;

module Test {
    export class Example {
        constructor(){}
    }
}

答案 1 :(得分:2)

我认为这是由于打字稿模块选项的混合。

您的类使用内部模块,输入文件使用外部模块。 请参阅此处的“使用其他JavaScript库”部分:http://www.typescriptlang.org/docs/handbook/modules.html

答案 2 :(得分:0)

当尝试在我的一个打字稿文件之一中导入moment.d.ts类型定义文件时,我遇到了同样的问题。

我还将整个班级都包装在module中。我要解决的问题的解决方案是,在我的打字稿文件-Scheduler.ts中,将import * as moment from "../definitions/moment/moment";行放在module声明的前面(请参见下图)。

为简洁起见,我没有包括整个班级的定义。

enter image description here

如您所见,我在打字稿文件中为外部库(reference pathjquerykendo ui)明确定义了moment

保存类型定义的文件夹结构。

enter image description here

下面也是我的tsconfig.json,不太确定设置此allowSyntheticDefaultImports: true可以缓解此问题。导入和在打字稿文件中使用时,我只是遵循在此link上写的注释。

    {
  "compileOnSave": true,
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "module": "commonjs",
    "strictNullChecks": false,
    "allowSyntheticDefaultImports": true
  }
}

答案 3 :(得分:0)

我成功地在自定义 Cypress 代码中使用导入的类型,使用与它们相同的语法:

declare global {
    namespace Cypress {

https://github.com/cypress-io/cypress/blob/3e8b52f3deb82b5d29b959cbbe01917010fa5f92/packages/net-stubbing/lib/external-types.ts#L368

所以它至少可以在命名空间中工作,没有在 ts 模块中进行测试,但我希望它也可以。

它似乎只适用于这种特定的上下文,因为如果我注释掉我的 import,它会抛出:Augmentations for the global scope can only be directly nested in external modules or ambient module declarations.ts(2669)。但如果你在那里,那就是你想要导入/导出一些东西。