输入'字符串| AddressInfo' 没有属性 'port' 也没有字符串索引签名

Yeg*_*mba 5 typescript

{ port }我得到错误:键入 'string | AddressInfo' 没有属性 'port',也没有字符串索引签名。

如何解决?

代码:

import * as express from 'express'
const app = express()

app.listen({ port: process.env.PORT })

const { port } = app.address()
Run Code Online (Sandbox Code Playgroud)

我的 tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": ["dom", "es6", "es2017", "esnext.asynciterable"],
    "sourceMap": true,
    "outDir": "./dist",
    "moduleResolution": "node",

    "composite": true,
    "removeComments": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "allowSyntheticDefaultImports": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "baseUrl": ".."
  },
  "exclude": ["node_modules"],
  "include": ["./src/**/*.tsx", "./src/**/*.ts"],
  "references": [{ "path": "../common" }]
}
Run Code Online (Sandbox Code Playgroud)

Yeg*_*mba 12

找到解决方案,它对我有用:

import * as express from 'express'
import { AddressInfo } from 'net'

const app = express()

app.listen({ port: process.env.PORT })

const { port } = app.address() as AddressInfo
Run Code Online (Sandbox Code Playgroud)

  • 我想补充一点,发生这种情况的原因是服务器在侦听 IP 套接字时从 address() 方法返回 AddressInfo。当监听管道或 Unix 域套接字时,返回值是一个字符串 - https://nodejs.org/dist/latest-v12.x/​​docs/api/net.html#net_server_address 所以像这样转换它是完全安全的在明确的上下文中。 (4认同)