【问题标题】:External file doesn't compile in Typescript外部文件无法在 Typescript 中编译
【发布时间】:2016-12-14 18:20:20
【问题描述】:

我正在使用带有 Typescript 的 express-session 并遇到预期的问题并出现以下错误消息 -

“会话”类型上不存在属性“authz”

为了解决这个问题,我确实添加了一个名为 session.d.ts 的新外部文件,其中包含以下内容 -

import { Resources, ResourceAuth, Authz } from "../../models/Authz"

declare namespace Express {
  export interface Session {
    authz: Array<ResourceAuth>;
  }
}

在我的控制器中,我有以下内容 -

/// <reference path="../../../@types/session/session.d.ts" />

但是,我仍然不断收到错误消息。看起来我的 d.ts 文件没有被拾取。这是我的 tsconfig。我错过了什么?

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "outDir": "build",
    "sourceMap": true,
     "typeRoots": [
      "../node_modules/@types",
      "./@types"
    ],
    "types": [
      "core-js"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/@types/**/*.d.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

【问题讨论】:

    标签: session typescript express-session


    【解决方案1】:

    不要在定义文件中执行导入/导出语句。

    你真正想做的是扩展现有的接口Session。您可以通过在此处描述的普通 *.ts 文件/模块中合并接口来执行此操作: https://www.typescriptlang.org/docs/handbook/declaration-merging.html

    但是,由于您尝试扩展的接口位于不同的命名空间中,因此这是行不通的。我有同样的问题,并在这里问: Typescript: How to extend an existing interface in a globally declared namespace

    既然你想要一个解决方案:我通常做的是转换为 any 然后访问该值,因为我知道它在那里:

    let mySession: express.Session = session;
    let authz = (<any>mySession).authz;
    

    【讨论】:

    • 谢谢。这样可行。但是,我希望有比使用 更好的解决方案,否则我宁愿只使用 Javascript。 stackoverflow.com/questions/31304438/… 似乎讨论了一个类似的问题,并且发布者能够扩展它。不知道有什么区别。
    【解决方案2】:

    我意识到,如果我使用数组表示法,它就可以正常工作。

    所以 session['anythingreally'] = Authz.getAuthz() 有效!

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 2020-12-09
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2021-08-21
      • 2020-01-30
      相关资源
      最近更新 更多