-
Notifications
You must be signed in to change notification settings - Fork 310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PresetKeyに型を付ける #1217
The head ref may contain hidden characters: "PresetKey\u306B\u578B\u3092\u4ED8\u3051\u308B"
PresetKeyに型を付ける #1217
Conversation
export const presetKeySchema = z.string().uuid().brand<"PresetKey">(); | ||
export type PresetKey = z.infer<typeof presetKeySchema>; | ||
export const PresetKey = (id: string): PresetKey => presetKeySchema.parse(id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここが型定義している場所です
#956 で 流れとしては その後↓で |
おおお、ありがとうございます!!! うーん、なるほど。。 |
@k-chop さん 2023/02/24 7:31追記 良さそうなのができたのでたぶん解決しました! ので書いていたのはいったん閉じます。 経緯zodの方にいろいろ提案してみて、Partial化されるところのコードを教えてもらいました。 stringもsymbolもPartialじゃないRecordになってるっぽいので、じゃあBRAND型もPartial型じゃなくて良いのでは的な提案をしたいな~と。 ↓でコメントを書いてるとこが本題箇所です import { z } from "zod";
export const presetKeySchema = z.string().uuid().brand<"PresetKey">();
export type PresetKey = z.infer<typeof presetKeySchema>;
type RecordType<K extends string | number | symbol, V> = [string] extends [K]
? Record<K, V>
: [number] extends [K]
? Record<K, V>
: [symbol] extends [K]
? Record<K, V>
: [string & z.BRAND<"PresetKey">] extends [K] // ここを任意のz.BRANDに対応させたい。。
? Record<K, V>
: Partial<Record<K, V>>;
type Hoge = RecordType<PresetKey, string>; // PartialじゃないRecordになってる 2023/02/24 2:21追記 type RecordType<K extends string | number | symbol, V> = [string] extends [K]
? Record<K, V>
: [number] extends [K]
? Record<K, V>
: [symbol] extends [K]
? Record<K, V>
: K extends z.BRAND<infer B> // changed point
? Record<K, V>
: Partial<Record<K, V>>; |
// プリセットの変更 | ||
const changePreset = ( | ||
presetOrPresetKey: PresetSelectModelType | string | ||
): void => { | ||
const presetKey = | ||
typeof presetOrPresetKey === "string" | ||
? presetOrPresetKey | ||
: presetOrPresetKey.key; | ||
const changePreset = (presetKey: PresetKey | undefined): void => { | ||
store.dispatch("COMMAND_SET_AUDIO_PRESET", { | ||
audioKey: props.activeAudioKey, | ||
presetKey, | ||
}); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typeof
で切り分けるのが危なそうだったのでロジックを変えています。
といっても、PresetSelectModelType
型のときはその.key
がPresetKey
なのでかなり簡単でした。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
できたのでWIPあけました!
z.BRAND型のRecordはPartialになる仕様なのでasで型を変換
というコメントを書いていますが、これは変更できないかをzod側にPR作っています。
すみません! これ見ていただけると・・・! @y-chan |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おおよそLGTMですが、zodに対するPRがマージされているのであれば、一旦コミットを指定してzodをアップデートし、asを外すのもいいかな...?と思いました(ただ、package.jsonにコメントが書けないので、なぜzodをnpmではなくgithub経由でインストールするようになっているかを表せない可能性がありますが...)
latestを取り込むのは基本的に危険だと思います 😇 個人的には、まあやむを得ない場合のみにしときたいかもです。 |
であれば、
とか...? |
改良してみました! f3dc6b4 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTMです!
問題ないと思うのでマージします!! |
内容
PresetKeyをブランド型にしました。
EngineIdやSpeakerIdやAudioKeyと全く同じやり方です。
ちょっと不思議な点があったのでWIPです。
関連 Issue
close #1210
その他
なぜかBrand型をkeyにしたRecordがPartialになる(valueがoptinalになる)ので、zod側にissueを立ててみました。
z.infer
aRecord
withBrand
as a key, it becomes a Partial Record. colinhacks/zod#2065