2016-08-19 8 views
5

मैं सत्र सत्र में अपने कस्टम डेटा का उपयोग करने की अनुमति देने के लिए एक्सप्रेस सत्र टाइपिंग का विस्तार करना चाहता हूं। मैं एक वस्तु req.session.user जो मेरी कक्षा User का एक उदाहरण है:परिभाषा फ़ाइल (* d.ts) में आयात कक्षा

export class User { 
    public login: string; 
    public hashedPassword: string; 

    constructor(login?: string, password?: string) { 
     this.login = login || "" ; 
     this.hashedPassword = password ? UserHelper.hashPassword(password) : ""; 
    } 
} 

तो मैं मौजूदा एक्सप्रेस सत्र typings साथ परिभाषा विलय करने के लिए मेरी own.d.ts फ़ाइल बनाई:

import { User } from "./models/user"; 

declare module Express { 
    export interface Session { 
     user: User; 
    } 
} 

लेकिन यह सब पर काम नहीं कर रहा - वीएस कोड और टीएससी इसे नहीं देखता है। तो मैंने सरल प्रकार के साथ परीक्षण परिभाषा बनाई:

declare module Express { 
    export interface Session { 
     test: string; 
    } 
} 

और परीक्षण क्षेत्र ठीक काम कर रहा है, इसलिए आयात कारण समस्या है।

मैंने आयात के बजाय /// <reference path='models/user.ts'/> जोड़ने की भी कोशिश की लेकिन टीएससी ने उपयोगकर्ता वर्ग नहीं देखा - मैं * d.ts फ़ाइल में अपनी कक्षा का उपयोग कैसे कर सकता हूं?

संपादित करें: मैं संकलन पर परिभाषा फ़ाइलें उत्पन्न करने के लिए tsc सेट और अब मैं अपने user.d.ts है:

export declare class User { 
    login: string; 
    hashedPassword: string; 
    constructor(); 
    constructor(login: string, password: string); 
} 

और एक्सप्रेस Sesion देने के लिए खुद टाइपिंग फ़ाइल:

import { User } from "./models/user"; 
declare module Express { 
    export interface Session { 
     user: User; 
     uuid: string; 
    } 
} 

लेकिन अभी भी शीर्ष पर आयात विवरण पर काम नहीं कर रहा है। कोई विचार?

उत्तर

1

मुझे लगता है कि आप जिस समस्या का सामना कर रहे हैं, वह मॉड्यूल घोषणाओं में कक्षा टाइपिंग बढ़ाने के बारे में अधिक है। के रूप में आप अगर आप इस संकलन करने की कोशिश पर ध्यान देंगे

निर्यात, ठीक है:

// app.ts 
import { User } from '../models/user' 
let theUser = new User('theLogin', 'thePassword') 

ऐसा लगता है आपके Express की मॉड्यूल घोषणा बढ़ाने के लिए कोशिश कर रहे हैं, और तुम सच में करीब हैं। इस चाल करना चाहिए:

// index.d.ts 
import { User } from "./models/user"; 
declare module 'express' { 
    interface Session { 
    user: User; 
    uuid: string; 
    } 
} 

हालांकि, इस कोड की शुद्धता एक्सप्रेस घोषणा फ़ाइल के मूल कार्यान्वयन पर निश्चित रूप से निर्भर करता है।

+0

यदि मैं आयात विवरण को अंदर ले जाता हूं तो मुझे त्रुटि मिलती है: 'नामस्थान में आयात घोषणाएं मॉड्यूल का संदर्भ नहीं दे सकती हैं।'। यदि मैं आपके कोड को कॉपी-पेस्ट करता हूं तो मुझे मिला: 'परिवेश मॉड्यूल घोषणा में आयात या निर्यात घोषणा सापेक्ष मॉड्यूल नाम के माध्यम से मॉड्यूल का संदर्भ नहीं दे सकती है। और यदि मैं गैर-रिश्तेदार पथ का उपयोग करने का प्रयास करता हूं, तो मैं अपनी फ़ाइल का पता नहीं लगा सकता, इसलिए मैंने घोषणा फ़ोल्डर को node_modules विज्ञापन में पथ '' घोषणाएं/मॉडल/उपयोगकर्ता 'जोड़ें' लेकिन अभी भी पूरा डी.टी. काम नहीं कर रहा है - कर सकते हैं इंटेलिसेंस या टीएससी में एक्सप्रेस सत्र का अपना विस्तार नहीं देखता है। –

+0

मैं इन त्रुटियों से परिचित नहीं हूं, क्षमा करें। शायद आपके सेटअप में कुछ अलग है? क्या यह आपके लिए संकलित करता है? https://gist.github.com/pellejacobs/498c997ebb8679ea90826177cf8a9bad। –

+0

इस तरह यह काम करता है लेकिन अभी भी असली ऐप में काम नहीं करता है। मेरे पास सत्र ऑब्जेक्ट के साथ एक एक्सप्रेस अनुरोध ऑब्जेक्ट है और इसमें अन्य प्रकार घोषित हैं - नामस्थान एक्सप्रेस में मॉड्यूल 'एक्सप्रेस' नहीं: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/express-session/express- सत्र .d.ts –

संबंधित मुद्दे