ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

tsでクラスからファンクション以外のプロパティを抜き出した型を作る

Typescriptでコードを書いていてクラスの型から関数以外を抜き出した型が欲しくて、typescript meetupでMapped Typesとかのセッション見て頑張ったらできるのでは🤔ということでやってみた

typescript-jp.connpass.com

要するに以下のようなクラスからxyだけの型が欲しい

class Hoge {
  x: string
  y: number

  constructor(partial: Partial<Hoge>) {
    Object.assign(this, partial)
  }

  getHoge(): string {
    return `${this.x}-${this.y}`
  }
}

乃木坂46のANN聞きながら作ったやつ

export type OmitFunction<T> = Pick<
  T,
  {[K in keyof T]: T[K] extends (...args: any) => any ? never : K}[keyof T]
>

これを使うとclassの型からpropertyだけ取り出せる

type A = OmitFunction<Hoge> // => A is {x: string, y: number}

参考

ちなみに

ググったけど出てこなかったから1時間くらい悩んでやっと解決したのに、自分が付けた型名から検索ワードを考えた結果stackoverflowにすでにあった。。。

このへんどういうキーワード入れてやればいいかわからないのと、もうちょっといい感じの書き方ないのか?ってのが常についてまわる

stackoverflow.com

ただ回答見ても、同じようなコードだしなんかもっといい方法無いんだろうか

nest.jsの起動時のログを止める

github.com

tl;dr

  • 一旦LogLevelの設定でlogをなくす
  • 起動後Loggerの設定を上書きする

きっかけ

最近nest.jsを使っていて、serverless環境で動かす時にgoのechoだとできたんだけど、起動時のログ出るのなんとか抑制できないかなーと思って結構無理やりっぽくなったので誰かいい方法知ってたら教えてほしい

yuzu441.hateblo.jp

やりたいこと

  • 起動時の初期化ログの抑制
    • ただしerrorやwarnは出したい
  • 開発環境であればログは全部出す

実現方法

nestjsの型定義などを見てみたが、どうもそういうオプションはなさそうだった。

nestのプロジェクトを作成するとできるmain.tsに以下の変更を加える

const productionLoggerLevel = ['error', 'warn', 'log'] as LogLevel[]
async function bootstrap() {
  const isProd = process.env.NODE_ENV === 'production'

  const app = await NestFactory.create(
    AppModule,
    {
      logger: isProd ? ['error', 'warn'] : undefined,
    }
  )

  const port = process.env['PORT'] ?? 3000
  await app.listen(+port).then(() => {
    Logger.debug(`Server listen port ${port}`)
    isProd && Logger.overrideLogger(productionLoggerLevel)
  })
}

ここで重要なのはNestFactory.createproduction環境であれば['error', 'warn']だけをloggerに設定していて、listenのcallback内でLogger.overrideLogger(productionLoggerLevel)で再度上書きしている所

まとめ

nest.jsの初期化の処理を追っているとcreateの時にLoggerの設定を行っていてfalseを渡すとoverrideLoggerでLogger instanceをundefinedで上書きしているけど、LogLevelを設定するだけであればLoggerのインスタンスは上書きされない事がわかったので、一旦logを抜いたLogLevelを設定して、再度logが出力される設定で設定し直している

github.com

最近一個のサーバーでずっと動かしてるというより、コンテナとかでポンポン作るので起動時のログを素直に抑制できるオプションとか入れてくれないかな…

mi band4を買いました

母があまりにも通知に気づかないのと、寝てない自慢をするので睡眠トラッカーが欲しくmi band4を購入しました

ただいきなり渡しても使いこなせないだろうと言うことで使い方を学ぶために数日FitbitとMi Band 4を両手に装備した生活をします

tl;dr

  • やっぱフルカラー綺麗
  • 画面見たら自動でONになる期間を設定できる
  • bluetooth5の同期が超早い(fitbitとの比較
  • バッテリー充電取り外すのは死ぬほど面倒だが、fitbitと違い確実に充電できてるのはいいところ
    • 一度100%まで充電すると、画面明るさ3で2日で14%くらいの消費だったので2週間くらい充電しなくて良さそう
  • アカウントが削除できない
    • アカウントを削除するためのログインが押せない*1

以下、感想というかツイートです

*1:最後のツイート参照