【问题标题】:Property not found even when specified in deceleration file typescript即使在减速文件打字稿中指定时也找不到属性
【发布时间】:2020-11-26 02:37:08
【问题描述】:

当尝试从“express-request-id”中间件中定义并在 typescript 声明文件中声明的 express 请求对象中读取属性时,会引发错误。

我的 d.ts 文件定义了以下内容:

(server.d.ts)

declare namespace Express {
    export interface Request {
        id: string
    }
}

这应该是正确的。根据我的研究,这行不通的唯一方法是对它的错误引用。我引用它的方式是通过我的 tsconfig 中的 files 字段,如下所示:

{
    "compilerOptions": {
        "strict": true,
        "noImplicitAny": true,
        "target": "ESNext",
        "watch": true,
        "lib": ["ESNext", "ES7"],
        "types": ["node"],
        "moduleResolution": "node",
        "baseUrl": "./",
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "strictPropertyInitialization": false
    },
    "compileOnSave": true,

    "typeAcquisition": { "enable": true },

    // referenced here.
    "files": ["./server.d.ts"],

    // i have also tryed refrenceing it here and in a triple slash directive.
    "include": [
        "./*.ts",
        "./server/**/*.ts",
        "./shared/**/*.ts",
        "./api/**/*.ts",
        "./database/**/*.ts",
        "./builders/**/*"
    ]
}

产生错误的代码如下: (服务器/中间件/reqTerminator.ts)


import { Request, Response, NextFunction } from 'express'

// when testing triple slash directives they wore used here like the folowing:
// /// <reference types="../../server.d.ts" />

export const [completeRequest, middleware] = (() => {
    const connections = new Map<string, NodeJS.Timeout>()

    const completeRequest = async (request: Request, response: Response) => {
        const timeout = connections.get(request.id)
        if (timeout) clearTimeout(timeout)
        response.end()
        return connections.delete(request.id)
    }

    return [
        completeRequest,
        async (request: Request, response: Response, nextF: NextFunction) => {
            connections.set(
                request.id,
                setTimeout(() => {
                    completeRequest(request, response)
                }, 2000),
            )
            nextF()
        },
    ]
})()

export default middleware

错误是:

⨯ Unable to compile TypeScript:
server/middleware/reqTerminator.ts:7:43 - error TS2339: Property 'id' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.

7       const timeout = connections.get(request.id)
                                                ~~
server/middleware/reqTerminator.ts:10:37 - error TS2339: Property 'id' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.

10      return connections.delete(request.id)
                                          ~~
server/middleware/reqTerminator.ts:17:13 - error TS2339: Property 'id' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.

17                      request.id,

它正在与相应项目的 ts-node 一起运行。

【问题讨论】:

    标签: typescript express typescript-typings .d.ts


    【解决方案1】:

    最后,我通过在有问题的文件内部使用全局声明而不是使用声明文件来解决这个问题。 像这样:

    import { Request, Response, NextFunction } from 'express'
    
    // declaration start:
    declare global {
        namespace Express {
            interface Request {
                id: string
            }
        }
    }
    
    
    export const [completeRequest, middleware] = (() => {
        const connections = new Map<string, NodeJS.Timeout>()
    
        const completeRequest = async (request: Request, response: Response) => {
            const timeout = connections.get(request.id)
            if (timeout) clearTimeout(timeout)
            response.end()
            return connections.delete(request.id)
        }
    
        return [
            completeRequest,
            async (request: Request, response: Response, nextF: NextFunction) => {
                connections.set(
                    request.id,
                    setTimeout(() => {
                        completeRequest(request, response)
                    }, 2000),
                )
                nextF()
            },
        ]
    })()
    
    export default middleware
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 2019-02-13
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多