我想扩展Express Session类型以允许在会话存储中使用我的自定义数据。我有一个对象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
文件以将定义与现有的快速会话类型合并:
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'/>
导入,但tsc却没有看到User类-如何在* d.ts文件中使用我自己的类?
编辑:我将tsc设置为在编译时生成定义文件,现在我有了user.d.ts:
export declare class User {
login: string;
hashedPassword: string;
constructor();
constructor(login: string, password: string);
}
以及用于扩展Express Sesion的自定义文件:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
uuid: string;
}
}
但是当import语句放在最上面时仍然无法正常工作。有任何想法吗?
经过两年的TypeScript开发,我终于设法解决了这个问题。
基本上,TypeScript有两种类型的模块类型声明:“本地”(普通模块)和环境(全局)。第二种允许编写与现有模块声明合并的全局模块声明。这些文件之间有什么区别?
d.ts
仅当文件没有任何导入时,它们才被视为环境模块声明。如果提供了导入行,则现在将其视为普通模块文件,而不是全局文件,因此无法扩展模块定义。
因此,这就是我们在此讨论的所有解决方案都不起作用的原因。但幸运的是,自TS 2.9起,我们可以使用以下import()
语法将类型导入全局模块声明中:
declare namespace Express {
interface Request {
user: import("./user").User;
}
}
因此,这条线import("./user").User;
起到了神奇作用,现在一切正常:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句