programing

'Session & Partial' 유형에 'user' 속성이 없습니다.

telecom 2023. 6. 24. 08:46
반응형

'Session & Partial' 유형에 'user' 속성이 없습니다.

자바스크립트로 된 코드가 있었는데 그것을 타입스크립트로 변환하려고 합니다.

route.get('/order', async(req,res) => {  
    var sessionData = req.session;
    if(typeof sessionData.user === 'undefined')
    {        
        res.redirect('/panel/login');
    }    

이것은 내 코드의 한 부분으로, 예전에는 올바르게 작동했습니다.javascript하지만 지금 나는 이 오류를 받습니다.user:

속성 'user'가 'Session & Partial' 유형에 없습니다.

다음을 위해 유형을 추가해야 할 것 같습니다.sessionData가변 및(req, res)params 하지만 정확히 어떤 타입이 할당되어야 하는지 모르겠습니다.

PS: 이 질문이 중복된 것처럼 보이지만 다른 유사한 질문의 해결책을 시도해 보았지만 효과가 없었습니다.

어떤 도움이라도 주시면 감사하겠습니다.

express-session type 댓글에 명시된 대로 다음을 사용해야 합니다.Declaration merging.

구현 방법은 다음과 같습니다.Declaration mergingexpress-session:

import session from 'express-session';

declare module 'express-session' {
  export interface SessionData {
    user: { [key: string]: any };
  }
}

저는 방금 당신과 같은 문제에 직면했습니다.이것은 꽤 최근의 문제인 것 같습니다. 여기에 설명을 참조하십시오.

이 문제를 해결하기 위해 Github 문제에 설명된 대로 모듈을 오버로드했습니다.

import "express-session";
declare module "express-session" {
  interface SessionData {
    user: string;
  }
}

교체하기만 하면 됩니다.string그 분야에 필요한 유형으로.

또한 추가했습니다../typing-stubstsconfig.json

"typeRoots": [
      "./typing-stubs",
      "./node_modules/@types"
]

소스 코드를 추적하면 다음과 같은 설명을 찾을 수 있습니다.

    /**
     * This interface allows you to declare additional properties on your 
     * session object 
     * using [declaration merging] 
     * (https://www.typescriptlang.org/docs/handbook/declaration-merging.html).
     *
     * @example
     * declare module 'express-session' {
     *     interface SessionData {
     *         views: number;
     *     }
     * }
     *
     */
    interface SessionData {
        cookie: Cookie;
    }

설명서를 읽어 보십시오. 모듈 확대 섹션이 있습니다. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation

이제 "SessionData"를 직접 확장하고 src/types/express-session/index.d.ts:

import { SessionData } from "express-session"

declare module "express-session" {
    interface SessionData {
        user: { [key: string]: any }
    }
}

tsconfig.json은 컴파일에 선언을 포함하도록 유형 루트를 설정해야 합니다.

"typeRoots": ["./node_modules/@types", "./src/types"],

방금 했어요.

(req.session as ISession).UserName = payload.UserName;
(req.session as ISession).Email = payload.Email;

I 세션은 다음과 같은 내보내기 인터페이스입니다.

import { Session } from "express-session";

export interface ISession extends Session {
  UserName?: string;
  Email?: string;
}

다른 모든 제안들은 형식 선언을 무시하라고 하지만, 그 제안들은 저에게 효과가 없었습니다.이것이 유일하게 효과가 있었습니다.이것이 누군가에게 도움이 되기를 바랍니다.

이는 위의 모든 단계를 수행했지만 계속 실패하는 사람을 위해 나중에 참조하기 위한 것입니다(vscode는 더 이상 오류를 표시하지 않지만 여전히 실패함).ts-node문제, 추가--transpile-only당신에게package.json스크립트, 다음과 같습니다.nodemon --exec ts-node -T src/app.ts.

원본: 고속 요청에 대한 유형 스크립트 선언 병합 실패

저는 최근에 이 문제를 겪었고 여기 제가 생각해낸 해결책이 있습니다.

import { Request } from "express";
import { Session } from "express-session";

export type SessionWithUser = Session & { user: string | {}};

export type AuthRequest = Request & {
  session?: SessionWithUser;
  auth?: { user: string; permission_id: number };
};

언급URL : https://stackoverflow.com/questions/65108033/property-user-does-not-exist-on-type-session-partialsessiondata

반응형