【问题标题】:Can't see interfaces in namespaces在命名空间中看不到接口
【发布时间】:2017-10-18 13:21:40
【问题描述】:

这个问题与 Kendo UI 没有直接关系,更多的是关于 TypeScript 命名空间声明。

我正在尝试从 Kendo UI 库中导入一些界面。 Kendo UI 的 index.d.ts 结构如下:

declare namespace kendo.ui {
    class Draggable extends kendo.ui.Widget { ... }
    interface DraggableEvent { ... }
    // ... other declarations
}

现在我将这个声明导入到我的 TypeScript 文件中,如下所示:

import '@progress/kendo-ui';

奇怪的是,在我的 TypeScript 文件中,我只能看到类和函数声明,从命名空间之外看不到任何接口。

这就是我的 tsconfig.json 的配置方式:

{
  "compilerOptions": {
    "lib": [
      "dom",
      "es5",
      "es2015",
      "es2015.promise"
    ],
    "module": "es2015",
    "moduleResolution": "node",
    "strict": false,
    "target": "es2015",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true
  }
}

我尝试在某些接口声明之前添加export关键字,但无济于事。

有人可以解释一下这里发生了什么吗?

【问题讨论】:

  • 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊命名空间是“ES6”时代之前使用的旧模块语法,在 TS 中也称为“外部”模块。您通常不会在 TS 中导入/导出命名空间,因为它们对 JavaScript 没有意义。因此,您从其中一个文件中获得的只是类型。 typescriptlang.org/docs/handbook/namespaces-and-modules.html
  • @PerSvensson 那么我该如何使用这些接口呢?通过将 添加到文件顶部?
  • 嗯,新旧之间的界限有点​​模糊。在较新的编译器中,您不必 ///ref 只需导入“外部模块”。如果您在“项目模式”下运行(例如,您有一个 tsconfig.json,就像您一样),那么它应该获取该模块中的所有 .d.ts 文件。
  • 这个问题回答起来有点笼统。我认为剑道团队使用全局。因此,当您导入 kendo.js 文件时,它会修补窗口对象和/或 jQuery 对象(如果您使用该版本)。此版本中的 .d.ts 文件仅代表该全局定义的对象。 (例如,您不需要导入它,它没有外部模块)。这就是老派(vero old school)的做事方式。但是,再次取决于您使用的整个 index.d.ts 文件以及您使用的 kendo ui 版本。 docs.telerik.com/kendo-ui/third-party/typescript

标签: typescript kendo-ui


【解决方案1】:

Typescript 中的命名空间只是一个对象包装器。它将您的类和接口放置在具有您声明的名称的对象中。 这是一个名为 kendo.ui 的 Typescript 命名空间示例。 顺便说一句,您不必导入.d.ts 文件。

declare namespace kendo.ui {
    class Draggable {}
    interface DraggableEvent {}
}

class Test{
    constructor() { 
        let d = new kendo.ui.Draggable();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多