【问题标题】:Typescript namespace not resolved during runtimeTypescript 命名空间在运行时未解析
【发布时间】:2020-02-24 12:45:34
【问题描述】:

我对 Java 脚本模块结构以及 Typescript 非常陌生。

我正在尝试导入命名空间以及该命名空间下的所有导出成员。

我试图从我的文件中引用/导入的打字稿是 https://github.com/agea/CmisJS/blob/master/src/cmis.ts

在这个 ts 文件中,一个名为“cmis”的命名空间是这样导出的

export namespace cmis {

我正在尝试在另一个文件中引用/导入它,与 https://github.com/agea/CmisJS/blob/master/src/cmis.spec.ts

喜欢这个import { cmis } from 'cmis';

我在 npm 中完成了所有依赖项解析,Visual Studio 代码中的设计时依赖项工作正常。

我的 package.json

   {
  "title": "sdm-nodejsclient",
  "name": "cmsdm-nodejsclientis",
  "version": "0.0.1",
  "description": "a CMIS client library written in Typescript for node and the browser",
  "author": {
    "name": "Saurav Sarkar",
    "email": "saurav.sarkar1@gmail.com"
  },
  "dependencies": {
    "@types/jest": "^25.1.3",
    "@types/node": "^13.7.4",
    "chai": "^4.2.0",
    "cmis": "~1.0.2",
    "cross-fetch": "~1.1.1",
    "es6-promise": "~4.2.4",
    "isomorphic-base64": "~1.0.2",
    "isomorphic-form-data": "~1.0.0",
    "jest": "^25.1.0",
    "mocha": "^7.0.1",
    "ts-jest": "^25.2.1",
    "url-search-params-polyfill": "~2.0.2"
  },
  "devDependencies": {
    "@types/chai": "~4.1.2",
    "@types/mocha": "~2.2.48",
    "@types/node": "~8.5.2",
    "chai": "~4.1.2",
    "cmis": "~1.0.2",
    "mocha": "~5.0.0",
    "ts-loader": "~2.0.3",
    "ts-node": "~3.0.6",
    "typedoc": "~0.10.0",
    "typescript": "~2.7.1",
    "uglify-js": "~3.3.7",
    "uglifyjs-webpack-plugin": "~1.1.8",
    "webpack": "~3.10.0"
  }
}

但是每当我尝试运行相同的代码时,它都会失败并显示 TypeError: Cannot read property 'CmisSession' of undefined at

let session = new cmis.CmisSession(url);

源库中的index.d.ts

export * from './src/cmis';

因此,节点运行时无法解析导入的 cmis 命名空间,并且 vClearly 似乎是运行时依赖问题。

最好的问候, 索拉夫

【问题讨论】:

    标签: javascript node.js typescript


    【解决方案1】:

    命名空间不是 TypeScript 中的值,因此它不应包含任何实现,仅包含类型定义。

    例如:

    // types.d.ts
    // This is ok
    declare namespace MySpace {
      type Calc = (a: number, b: number) => number;
    }
    

    Calc 不是函数,只需键入即可。我们可以使用类型来说明编译器是什么东西(例如函数)。但是我们不能执行类型。 类型类似于元数据,它会在编译期间从代码中删除。这是 wy CmisSession 未定义。

    // types.d.ts
    // This is wrong! Type definition contains implementation.
    declare namespace MySpace {
      type Calc = (a: number, b: number) => { return a + b; };
    }
    

    实现不应与类型定义混合。 实现函数calc:

    // index.ts
    const calc: MySpace.Calc = (a, b) => a + b;
    

    不需要在实现中声明类型。这就是命名空间出现并帮助描述代码的原因。

    【讨论】:

    • @e.vyushin...感谢您查找此内容...但是如果您看到 cmis.ts 的代码,我看不到任何实现在命名空间内完成..实际上命名空间“ cmis" 未声明但仅导出...可能是我遗漏了一些简单的东西
    • cmis package.json 不包含一些必要的属性,例如maintypes。这可能会导致导入错误。尝试直接从 dist 导入 cmis。 typescript import { cmis } from './node_modules/cmis/dist/cmis'; const session = new cmis.CmisSession('url');
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2011-07-08
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2014-01-25
    相关资源
    最近更新 更多