第19回コベチケの会

コベリンの最近の取り組みとして、業務などで役立ちそうな知見を共有する会を開催することになりました。 そのついでに発表に使ったアジェンダもそのまま公開してしまおうという豪快な企画です。

※ アジェンダをそのままコピペして公開したものなので若干見にくい箇所もあるかもしれませんが、ご了承ください。

typescript の型のない世界からある世界への表現

概要

API などから取得したデータは型がないのでバリデーションした上で型を付ける必要がある。その方法の説明。

Swift でいうところの

Any や Data、Dictionary から何らかの型をつける作業. Codable だったり JSONSerialization を使う部分。

TypeScript でも型がつかない条件はよくある

API レスポンス

const resp = await api.get("/user")
// resp.body に HTTP response の body が入っているとしたら
// resp.body が any または unkown な状態

firebase firestore

const docRef = doc(db, "cities", "SF");
const docSnap = await getDoc(docRef);
// docSnap.data() には型がない

withConverter を使ってあげるといいよ。 https://firebase.google.com/docs/firestore/query-data/get-data#custom_objects

どうするか?

以降は API の例で User という型がある前提で行きます。

ダメなやり方

as User する。

const resp = await api.get("/user")
const user = resp.body as User

無理やり変換は良くない。

Type gurad する

これはまぁまぁ良い。

type User = {
  name: string
  id: string
}

function isUser(arg: unkonwn) arg is User {
   // User だったら true を返すように typeof とか使って自分で実装する
   return typeof arg.name === "string" && typeof arg.id === "string"
}

const body: any = getUser()
if (isUser(body)) {
  // body が user になってる
}

しかし、自分で type guard の関数をメンテするのが大変 & ロジックのミスも発生しがち。 ex) User に新しいプロパティー増えたときとか。 また、type guard の関数で return true しても成立してしまう...

いい感じのライブラリを使う

※ Scheme だけ管理すればいいのでメンテコストが低い

Chartsで角丸したい... @takkumattsu

https://github.com/danielgindi/Charts

グラフの角を丸くしたいけど https://github.com/danielgindi/Charts/issues/1066 色々な理由でPRはマージされていない(6年くらいマージされていない)

やるには render をカスタムしてやるしかない やり方はちゃんと書いてあったのは↓のgistしかなくて、カスタムクラスとして使うのではなく元のファイルを書き換えるようだったので、カスタムクラスで使えるように書き換えた

A simple drop-in replacement for rounding bar charts corner in Swift Charts library · GitHub

iOSでしか使えないので注意

https://gist.github.com/ShadeApps/9285904fc716dbe6c13c6fbff23ab27e を iOSでカスタムクラスとして使えるように修正 · GitHub