til :入力スクリプトでHTTPタイプのヘッダを取得する
9630 ワード
ゴール
私はバックエンドフレームワークの開発者です.これはタイプスクリプトで書かれています.欲しいです
http.IncomingMessage
) 私のユーザーからhttp.IncomingHttpHeaders
). 実装
考慮する
http.IncomingHttpHeaders
インタフェースinterface IncomingHttpHeaders {
'accept-patch'?: string;
'accept-ranges'?: string;
'accept'?: string;
…
'warning'?: string;
'www-authenticate'?: string;
[header: string]: string | string[] | undefined;
}
ヘッダ名がハードコードされている場合の問題点:Context
そして、各リクエストに対してハンドラのインスタンスを渡します:export class Context {
constructor(private req: http.IncomingMessage) { }
…
getHeader(name: ?) {
return req.headers[name];
}
}
…
私たちがしたいことは、代わりにいくつかの種類のタイプを導入することです?
それで、それはそれらからのそれらのヘッダーだけを許しますhttp.IncomingHttpHeaders
これはハードコード化されています.また、このリストを簡単に拡張することができます.
問題1
簡単に使えません
type StandardHeaders = keyof http.IncomingHtppHeaders
インタフェースがインデックス署名を持っているのでStandardHeaders
自動補完とコンパイル時間のチェックが動作しないように何かを受け入れる.解決-インターフェイスからインデックス署名を削除します.バージョン4.1以降では、キーの再マッピングとタイプスクリプト2.8と新しい条件付きの型があります.ここでは4.1バージョンのみを提供します.
type StandardHeaders = {
// copy every declared property from http.IncomingHttpHeaders
// but remove index signatures
[K in keyof http.IncomingHttpHeaders as string extends K
? never
: number extends K
? never
: K]: http.IncomingHttpHeaders[K];
};
それは私たちのコピーを与えるhttp.IncomingHttpHeaders
インデックス署名を削除しました.それは事実に基づいている
‘a’ extends string
is true
でもstring extends ’a’
is false
. 同じnumber
.今すぐにできます.
type StandardHeader = keyof StandardHeaders;
それはVSCODEが考えるものですStandardHeader
:既知のヘッダのみのnice型リテラル.接続しましょう
getHeader(name: StandardHeader)
試してみてください.自動補完作業とコンパイルは中断します.
問題2.
我々はフレームワークです、このセットのヘッダーはかなり狭いので、我々は人々にそれを拡張する能力を与える必要があります.
これは、前のものを解決するのがより簡単です.を作りましょう
Context
ジェネリックといくつかのものを追加します.export class Context<TCustomHeader extends string = StandardHeader> {
constructor(private req: http.IncomingMessage) { }
…
getHeader(name: StandardHeader | TCustomHeader) {
return req.headers[name];
}
…
}
では、以下のように書くことができます.const ctx = new Context<'X-Foo' | 'X-Bar'>(...);
const foo = ctx.getHeader('X-Foo');
const bar = ctx.getHeader('X-Bar');
そして、これらのヘッダを自動補完します.コンパイル時にチェックを入れます.
更なる改善
フレームワークなので、ユーザーは
Context
クラス自体、我々はそれらを配っている.その代わりに、我々はクラスを導入しなければなりませんContextHeaders
置換getHeader(header: StandardHeader)
ジェネリックメソッドheaders< TCustomHeader extends string = StandardHeader>: ContextHeaders<StandardHeader | TCustomHeader>
これは読者=のための運動として残されている).Reference
この問題について(til :入力スクリプトでHTTPタイプのヘッダを取得する), 我々は、より多くの情報をここで見つけました https://dev.to/tmlr/til-get-strongly-typed-http-headers-with-typescript-3e33テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol