Open4

[TypeScript] 中級者になる

TakashiAiharaTakashiAihara

Record

ソース

https://github.com/microsoft/TypeScript/blob/eeed72171f8a099f47d70dfd1618929c264444d5/src/lib/es5.d.ts#L1581-L1583

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;
}
TakashiAiharaTakashiAihara

あるパッケージの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の本番経験がないもので、間違いやより良いやり方があればご意見ください!
よろしくお願いします。🙇