Saya ingin memperluas pengetikan Sesi Ekspres untuk memungkinkan penggunaan data khusus saya dalam penyimpanan sesi. Saya memiliki objek req.session.user
yang merupakan turunan dari kelas saya User
:
export class User {
public login: string;
public hashedPassword: string;
constructor(login?: string, password?: string) {
this.login = login || "" ;
this.hashedPassword = password ? UserHelper.hashPassword(password) : "";
}
}
Jadi saya membuat own.d.ts
file saya untuk menggabungkan definisi dengan jenis sesi ekspres yang ada:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
}
}
Tapi itu tidak berfungsi sama sekali - VS Code dan tsc tidak melihatnya. Jadi saya membuat definisi tes dengan tipe sederhana:
declare module Express {
export interface Session {
test: string;
}
}
Dan bidang uji bekerja dengan baik, jadi impor menyebabkan masalah.
Saya juga mencoba menambahkan /// <reference path='models/user.ts'/>
sebagai gantinya impor tetapi tsc tidak melihat kelas Pengguna - bagaimana saya dapat menggunakan kelas saya sendiri di file * d.ts?
EDIT: Saya mengatur tsc untuk menghasilkan file definisi pada kompilasi dan sekarang saya memiliki user.d.ts saya:
export declare class User {
login: string;
hashedPassword: string;
constructor();
constructor(login: string, password: string);
}
Dan file pengetikan sendiri untuk memperluas Express Sesion:
import { User } from "./models/user";
declare module Express {
export interface Session {
user: User;
uuid: string;
}
}
Tapi masih tidak berfungsi saat pernyataan impor di atas. Ada ide?
sumber
process
.MEMPERBARUI
Sejak skrip ketikan 2.9, Anda tampaknya dapat mengimpor tipe ke dalam modul global. Lihat jawaban yang diterima untuk informasi lebih lanjut.
JAWABAN ASLI
Saya pikir masalah yang Anda hadapi lebih banyak tentang menambah deklarasi modul kemudian mengetik kelas.
Pengeksporan baik-baik saja, karena Anda akan melihat jika Anda mencoba mengompilasi ini:
// app.ts import { User } from '../models/user' let theUser = new User('theLogin', 'thePassword')
Sepertinya Anda mencoba menambah deklarasi modul
Express
, dan Anda sudah sangat dekat. Ini harus melakukan trik:// index.d.ts import { User } from "./models/user"; declare module 'express' { interface Session { user: User; uuid: string; } }
Namun, kebenaran kode ini tentu saja bergantung pada implementasi asli dari file deklarasi ekspres.
sumber
Import declarations in a namespace cannot reference a module.
. Jika saya copy-paste kode Anda aku:Import or export declaration in an ambient module declaration cannot reference module through relative module name.
. Dan jika saya mencoba menggunakan jalur non-relatif, saya tidak dapat menemukan file saya, jadi saya memindahkan folder deklarasi ke jalur penambahan iklan node_modules"declarations/models/user"
tetapi tetap saja seluruh d.ts tidak berfungsi - tidak dapat melihat ekstensi sendiri dari sesi ekspres di intelisense atau tsc.declare module 'myModule' {import { FancyClass } from 'fancyModule'; export class MyClass extends FancyClass {} }
Terima kasih atas jawaban dari Michał Lytek . Berikut adalah metode lain yang saya gunakan dalam proyek saya.
Kita dapat mengimpor
User
dan menggunakannya kembali beberapa kali tanpa menulis diimport("./user").User
mana-mana, dan bahkan memperpanjang atau mengekspornya kembali.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 } }
Selamat bersenang-senang :)
sumber
Apakah tidak mungkin hanya mengikuti logika dengan
express-session
:own.d.ts
:import express = require('express'); import { User } from "../models/user"; declare global { namespace Express { interface Session { user: User; uuid: string; } } }
Yang utama
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; });
Setidaknya ini tampaknya dapat dikompilasi tanpa masalah apa pun. Untuk kode lengkapnya, lihat https://github.com/masa67/so39040108
sumber
tsc
tidak akan mengkompilasinya. Mereka dimaksudkan untuk berada dalam kompilasi tetapi tidak dalam keluaran