Chcę rozszerzyć zakres typów Express Session, aby umożliwić używanie moich danych niestandardowych w pamięci sesji. Mam obiekt req.session.user
będący instancją mojej klasy User
:
export class User {
public login: string;
public hashedPassword: string;
constructor(login?: string, password?: string) {
this.login = login || "" ;
this.hashedPassword = password ? UserHelper.hashPassword(password) : "";
}
}
Utworzyłem więc mój own.d.ts
plik, aby scalić definicję z istniejącymi typami sesji ekspresowych:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
}
}
Ale to w ogóle nie działa - VS Code i tsc go nie widzą. Utworzyłem więc definicję testu z prostym typem:
declare module Express {
export interface Session {
test: string;
}
}
Pole testowe działa dobrze, więc problem powoduje import.
Próbowałem też /// <reference path='models/user.ts'/>
zamiast tego dodać import, ale tsc nie widział klasy użytkownika - jak mogę użyć własnej klasy w pliku * d.ts?
EDYCJA: Ustawiłem tsc na generowanie plików definicji podczas kompilacji i teraz mam mojego user.d.ts:
export declare class User {
login: string;
hashedPassword: string;
constructor();
constructor(login: string, password: string);
}
Oraz własny plik do wpisywania do rozszerzenia Express Sesion:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
uuid: string;
}
}
Ale nadal nie działa, gdy instrukcja import na górze. Jakieś pomysły?
źródło
process
obiekt Node .AKTUALIZACJA
Od wersji 2.9 maszynopisu wydaje się, że możesz importować typy do modułów globalnych. Zobacz zaakceptowaną odpowiedź, aby uzyskać więcej informacji.
ORYGINALNA ODPOWIEDŹ
Myślę, że problem, z którym się zmagasz, polega bardziej na rozszerzaniu deklaracji modułów niż na typowaniu klas.
Eksportowanie jest w porządku, jak zauważysz, próbując skompilować to:
// app.ts import { User } from '../models/user' let theUser = new User('theLogin', 'thePassword')
Wygląda na to, że próbujesz rozszerzyć deklarację modułu
Express
i jesteś naprawdę blisko. To powinno załatwić sprawę:// index.d.ts import { User } from "./models/user"; declare module 'express' { interface Session { user: User; uuid: string; } }
Jednak poprawność tego kodu zależy oczywiście od oryginalnej implementacji pliku deklaracji ekspresowej.
źródło
Import declarations in a namespace cannot reference a module.
. Gdybym kopiuj-wklej kod mam:Import or export declaration in an ambient module declaration cannot reference module through relative module name.
. A jeśli spróbuję użyć ścieżki względnej, nie mogę zlokalizować mojego pliku, więc przeniosłem folder deklaracji do ścieżki dodawania reklamy node_modules,"declarations/models/user"
ale nadal cały d.ts nie działa - nie widzę własnego rozszerzenia sesji ekspresowej w intelisense lub tsc.declare module 'myModule' {import { FancyClass } from 'fancyModule'; export class MyClass extends FancyClass {} }
Dzięki odpowiedzi Michała Lytka . Oto inna metoda, której użyłem w moim projekcie.
Możemy go importować
User
i używać wielokrotnie bez zapisywania wimport("./user").User
dowolnym miejscu, a nawet rozszerzać go lub ponownie eksportować .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 } }
Baw się dobrze :)
źródło
Czy nie można po prostu podążać za logiką
express-session
:own.d.ts
:import express = require('express'); import { User } from "../models/user"; declare global { namespace Express { interface Session { user: User; uuid: string; } } }
Głównie
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; });
Przynajmniej wydaje się, że kompiluje się to bez żadnych problemów. Pełny kod znajduje się na https://github.com/masa67/so39040108
źródło
tsc
ich nie skompilujesz. Mają być w kompilacji, ale nie na wyjściu