【发布时间】: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