request.url 未定义类型,为什么?

request.url undefined type, why?

为什么 request.url 在 nodejs 类型中被定义为可选? 如果请求到达 http 服务器,则根据定义应该有 url。

为什么这里有个问号? url?: string;

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node/http.d.ts#L288

我不太了解节点中的http/Request,但这似乎是糟糕建模的经典示例(通常在@types/node定义中找到,要么是由于类型的编写方式,要么是由于 node.js API 本身的底层设计)。

IncomingMessage 被建模为带有可选键的产品类型,而不是正确的总和类型 - 以区分客户端请求和服务器生成请求的情况。然后将关于不变量的注释放在单个字段上方,使它们在 TS / 静态类型检查方面无用。

仅阅读该定义,更好的类型定义可能是:

interface ClientIncomingMessage extends stream.Readable {
  // ... many other fields ...
  url: string;
}

interface ServerIncomingMessage extends stream.Readable {
  // ... many other fields ...
  // no `url` fields here!
}

type IncomingMessage = ClientIncomingMessage | ServerIncomingMessage