我想扩展 Express Session 类型以允许在会话存储中使用我的自定义数据。我有一个对象req.session.user,它是我的类的一个实例User:
req.session.user
User
export class User { public login: string; public hashedPassword: string; constructor(login?: string, password?: string) { this.login = login || "" ; this.hashedPassword = password ? UserHelper.hashPassword(password) : ""; } }
所以我创建了我的own.d.ts文件以将定义与现有的快速会话类型合并:
own.d.ts
import { User } from "./models/user"; declare module Express { export interface Session { user: User; } }
但它根本不起作用 - VS Code 和 tsc 看不到它。所以我用简单的类型创建了测试定义:
declare module Express { export interface Session { test: string; } }
并且测试字段工作正常,因此导入导致问题。
我也尝试添加/// <reference path='models/user.ts'/>而不是 import 但 tsc 没有看到 User 类 - 我如何在 *d.ts 文件中使用我自己的类?
/// <reference path='models/user.ts'/>
编辑: 我将 tsc 设置为在编译时生成定义文件,现在我有了 user.d.ts:
export declare class User { login: string; hashedPassword: string; constructor(); constructor(login: string, password: string); }
以及用于扩展 Express Session 的自己的打字文件:
import { User } from "./models/user"; declare module Express { export interface Session { user: User; uuid: string; } }
但是当 import 声明在上面时仍然不起作用。有任何想法吗?
经过两年的 TypeScript 开发,我终于设法解决了这个问题。
基本上,TypeScript 有两种模块类型声明:“本地”(普通模块)和环境(全局)。第二种允许编写与现有模块声明合并的全局模块声明。这些文件有什么区别?
d.ts仅当文件没有任何导入时,它们才被视为环境模块声明。如果您提供导入行,它现在被视为普通模块文件,而不是全局文件,因此扩充模块定义不起作用。
d.ts
这就是为什么我们在这里讨论的所有解决方案都不起作用的原因。import()但幸运的是,从 TS 2.9 开始,我们能够使用语法将类型导入全局模块声明:
import()
declare namespace Express { interface Request { user: import("./user").User; } }
所以这条线很import("./user").User;神奇,现在一切正常:)
import("./user").User;