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
为什么 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