Quiero extender la tipificación de Express Session para permitir el uso de mis datos personalizados en el almacenamiento de sesiones. Tengo un objeto req.session.user
que es una instancia de mi clase User
:
export class User {
public login: string;
public hashedPassword: string;
constructor(login?: string, password?: string) {
this.login = login || "" ;
this.hashedPassword = password ? UserHelper.hashPassword(password) : "";
}
}
Así que creé mi own.d.ts
archivo para fusionar la definición con las tipificaciones de sesión exprés existentes:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
}
}
Pero no funciona en absoluto: VS Code y tsc no lo ven. Así que creé una definición de prueba con un tipo simple:
declare module Express {
export interface Session {
test: string;
}
}
Y el campo de prueba funciona bien, por lo que la importación causa el problema.
También intenté agregar en su /// <reference path='models/user.ts'/>
lugar la importación, pero el tsc no vio la clase de usuario: ¿cómo puedo usar mi propia clase en el archivo * d.ts?
EDITAR: configuré tsc para generar archivos de definición en la compilación y ahora tengo mi user.d.ts:
export declare class User {
login: string;
hashedPassword: string;
constructor();
constructor(login: string, password: string);
}
Y el propio archivo de mecanografía para ampliar Express Sesion:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
uuid: string;
}
}
Pero aún no funciona cuando se importa la declaración en la parte superior. ¿Algunas ideas?
fuente
process
objeto de Node .ACTUALIZAR
Desde mecanografiado 2.9, parece que puede importar tipos en módulos globales. Consulte la respuesta aceptada para obtener más información.
RESPUESTA ORIGINAL
Creo que el problema al que te enfrentas es más sobre el aumento de las declaraciones de módulos que la escritura de clases.
La exportación está bien, como notará si intenta compilar esto:
// app.ts import { User } from '../models/user' let theUser = new User('theLogin', 'thePassword')
Parece que está intentando aumentar la declaración del módulo de
Express
, y está muy cerca. Esto debería funcionar:// index.d.ts import { User } from "./models/user"; declare module 'express' { interface Session { user: User; uuid: string; } }
Sin embargo, la exactitud de este código depende, por supuesto, de la implementación original del archivo de declaración expresa.
fuente
Import declarations in a namespace cannot reference a module.
. Si copiar y pegar el código que tengo:Import or export declaration in an ambient module declaration cannot reference module through relative module name.
. Y si trato de usar una ruta no relativa, no puedo ubicar mi archivo, así que moví la carpeta de declaraciones a node_modules y"declarations/models/user"
agregué la ruta, pero aún así todo el d.ts no funciona; no puedo ver la extensión propia de la sesión exprés en intelisense o tsc.declare module 'myModule' {import { FancyClass } from 'fancyModule'; export class MyClass extends FancyClass {} }
Gracias a la respuesta de Michał Lytek . Aquí hay otro método que utilicé en mi proyecto.
Podemos importarlo
User
y reutilizarlo varias veces sin escribir enimport("./user").User
todas partes, e incluso extenderlo o reexportarlo .declare namespace Express { import("./user"); // Don't delete this line. import { User } from "./user"; export interface Request { user: User; target: User; friend: User; } export class SuperUser extends User { superPower: string; } export { User as ExpressUser } }
Que te diviertas :)
fuente
¿No es posible simplemente seguir la lógica con
express-session
:own.d.ts
:import express = require('express'); import { User } from "../models/user"; declare global { namespace Express { interface Session { user: User; uuid: string; } } }
En el principal
index.ts
:import express from 'express'; import session from 'express-session'; import own from './types/own'; const app = express(); app.get('/', (req, res) => { let username = req!.session!.user.login; });
Al menos esto parece compilarse sin problemas. Para obtener el código completo, consulte https://github.com/masa67/so39040108
fuente
tsc
no los compilará. Están destinados a estar en la compilación pero no en la salida