request.url неопределенный тип, почему? - PullRequest
0 голосов
/ 14 октября 2019

Почему request.url определяется как необязательный в типах nodejs? Если запрос приходит на http-сервер, он должен иметь URL по определению.

Почему здесь стоит вопросительный знак? url?: string;

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

1 Ответ

0 голосов
/ 14 октября 2019

Я не знаю много о http / Request в узле, но это, кажется, классический пример плохого моделирования (которое часто встречается в определениях @types/node, либо из-за того, что типы имеютбыл написан или в базовый дизайн самого API-интерфейса node.js).

IncomingMessage моделируется как тип продукта с дополнительными ключами, а не как правильный тип суммы - чтобы отличить регистр клиентазапрос от сервера сгенерирован один. Комментарии об инвариантах помещаются над отдельными полями, что делает их бесполезными с точки зрения проверки TS / статического типа.

Считая только это определение, лучше определить тип def:

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

...