Open4
[TypeScript] 中級者になる
Record
ソース
Recordのパターン変換
単純Object
type hoge = Record<string, string>;
⇅ 変換
type hoge = {
[x: string]: string;
};
Unionでプロパティキーが決まるパターン
type keys = "home" | "profile" | "contact";
type hoge = Record<keys, string>;
⇅ 変換
type keys = "home" | "profile" | "contact";
type hoge = {
[K in keys]: string;
};
⇅ 変換
type hoge = {
home: string;
profile: string;
contact: string;
}
Pick
ソース
- T -> pick元
- K -> Tが持つkeyのうちのいずれか
- P -> K の key
使いどころ
キーは継承関係にあることが分かっているが、型が分からない場合に従属させる。
keyof any
type hoge = keyof any
⇅ 変換
type hoge = string | number | symbol
indexとして利用可能な型のみ得られる。
使いどころ
確実にindexとして利用したいものに対して、extends keyof any
としてあげると、バグが防げる。
あるパッケージのdefault export をそのまま default export したい。
ただ仲介してあげる感じ。
結論
export { default } from "next-auth";
こういう書き方ができる。
import NextAuth from "next-auth";
export default NextAuth;
これも正解だが、前述のほうがより短い。
やりがち
import * as NextAuth from "next-auth";
export default NextAuth;
* as ~~
は default を受け取るわけではないのでエラー。
どこで使う
monorepoでパッケージの責務を一つに集約するときに使う。
例えば、next-authの実装を "auth" というワークスペースにまとめたとして、
コンポーネントとして利用するのは "web" で使う、みたいなパターン。
このとき、各ワークスペースのpackage.jsonにnext-auth が定義されていると、バージョンの2重管理になるし、バグにつながる可能性も。
問題になりえるケース
"packages/auth"
-> "next-auth": "^4.22.3",
"packages/web"
-> "next-auth": "^4.20.1",
改善後
"packages/auth"
-> "next-auth": "^4.22.3",
"packages/web"
-> "@acme/auth": "0.1.0",
上記で、next-authに関わるものはすべて @acme/auth を通す。
補足
自分はmonorepoの本番経験がないもので、間違いやより良いやり方があればご意見ください!
よろしくお願いします。🙇