Quero estender as tipificações Express Session para permitir o uso de meus dados personalizados no armazenamento de sessão. Eu tenho um objeto req.session.user
que é uma instância da minha classe User
:
export class User {
public login: string;
public hashedPassword: string;
constructor(login?: string, password?: string) {
this.login = login || "" ;
this.hashedPassword = password ? UserHelper.hashPassword(password) : "";
}
}
Então, criei meu own.d.ts
arquivo para mesclar a definição com as tipificações de sessão expressa existentes:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
}
}
Mas não está funcionando - o VS Code e o tsc não percebem. Então, criei uma definição de teste com tipo simples:
declare module Express {
export interface Session {
test: string;
}
}
E o campo de teste está funcionando bem, então a importação causa problema.
Eu também tentei adicionar em /// <reference path='models/user.ts'/>
vez de importar, mas o tsc não viu a classe de usuário - como posso usar minha própria classe no arquivo * d.ts?
EDITAR: Eu defino tsc para gerar arquivos de definição na compilação e agora tenho meu user.d.ts:
export declare class User {
login: string;
hashedPassword: string;
constructor();
constructor(login: string, password: string);
}
E o próprio arquivo de digitação para estender Express Sesion:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
uuid: string;
}
}
Mas ainda não funciona quando a declaração de importação no topo. Alguma ideia?
fonte
process
objeto do Node .ATUALIZAR
Desde o typescript 2.9, você parece ser capaz de importar tipos para módulos globais. Veja a resposta aceita para mais informações.
RESPOSTA ORIGINAL
Acho que o problema que você está enfrentando é mais sobre como aumentar as declarações de módulos do que sobre a digitação de classes.
A exportação é boa, como você notará se tentar compilar isto:
// app.ts import { User } from '../models/user' let theUser = new User('theLogin', 'thePassword')
Parece que você está tentando aumentar a declaração do módulo de
Express
e está muito perto. Isso deve funcionar:// index.d.ts import { User } from "./models/user"; declare module 'express' { interface Session { user: User; uuid: string; } }
No entanto, a exatidão desse código depende, é claro, da implementação original do arquivo de declaração expressa.
fonte
Import declarations in a namespace cannot reference a module.
. Se eu copiar e colar o código que eu tenho:Import or export declaration in an ambient module declaration cannot reference module through relative module name.
. E se eu tentar usar o caminho não relativo, não consigo localizar meu arquivo, então movi a pasta de declarações para node_modules e o caminho de adição,"declarations/models/user"
mas ainda assim o d.ts inteiro não está funcionando - não consigo ver a própria extensão da sessão expressa no intelisense ou tsc.declare module 'myModule' {import { FancyClass } from 'fancyModule'; export class MyClass extends FancyClass {} }
Graças à resposta de Michał Lytek . Aqui está outro método que usei em meu projeto.
Podemos importá
User
- lo e reutilizá- lo várias vezes sem escrever emimport("./user").User
todos os lugares e até mesmo estendê- lo ou reexportá- lo.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 } }
Diverta-se :)
fonte
Não é possível apenas seguir a lógica com
express-session
:own.d.ts
:import express = require('express'); import { User } from "../models/user"; declare global { namespace Express { interface Session { user: User; uuid: string; } } }
Principalmente
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; });
Pelo menos parece compilar sem problemas. Para o código completo, consulte https://github.com/masa67/so39040108
fonte
tsc
não os compilará. Eles devem estar na compilação, mas não na saída