世界を動かす技術を、日本語で。

Zed Editor テーマビルダー

16時間前原文(zed.dev)

概要

このコードは、Reactで作成された 会議スケジューラー コンポーネントの実装例です。 TypeScriptの型エラーや記述ミスが複数含まれています。 主な修正点とポイントを 箇条書き で整理します。 エラーメッセージの内容と原因も 明確化 します。 改善案と リファクタリング方法 を提案します。

コードの主な問題点と修正案

  • 型定義の誤り

    • Meetingインターフェースで couldHaveBeenAnEmailactuallyStartsOnTime の型宣言が抜けている
      • 修正例:
        • couldHaveBeenAnEmail: boolean
        • actuallyStartsOnTime: string
    • attendeesの型名が atendees と誤記されている箇所
      • 修正例: validateMeeting関数の引数名をattendeesに統一
  • 未使用変数やconst指定漏れ

    • agendaItemは再代入されていないため const で宣言可能
    • "couldHaveBeenAnEmail"はインターフェース宣言自体が未使用の場合、削除または利用箇所を明確化
  • 型不一致

    • actuallyStartsOnTimeに"never"(string型)を代入しているが、Meeting型でnumber型を要求している
      • 修正例: MeetingインターフェースのactuallyStartsOnTimeをstring型に変更
  • 配列の型指定

    • MEETING_EXCUSESはas constで定数配列指定済み、問題なし
  • バリデーション関数の引数名

    • validateMeeting関数の引数名が間違っている
      • 修正例: (attendees: string[]) => ... に変更
  • propsの型定義

    • MeetingSchedulerPropsの型定義は適切、問題なし
  • 関数のコールバックとuseCallback依存配列

    • useCallbackの依存配列にonMeetingCreate, requiresSnacksを含めているため、再レンダリング時の不具合なし
  • フォームのonSubmitとバリデーション

    • handleCreateMeetingの呼び出し時、バリデーションエラーが正しくハンドリングされている

具体的な修正例

  • Meetingインターフェース修正

    • interface Meeting {
        id: string
        title: string
        couldHaveBeenAnEmail: boolean
        attendees: string[]
        snacksProvided: boolean
        actuallyStartsOnTime: string
      }
      
  • validateMeeting関数修正

    • function validateMeeting(attendees: string[]): boolean {
        return attendees.length > 0 && attendees.length < 50
      }
      
  • agendaItemのconst化

    • const agendaItem = "Discuss why we need more meetings"
      

エラーメッセージの和訳と原因

  • 'couldHaveBeenAnEmail' is declared but its value is never read.

    • 「'couldHaveBeenAnEmail'は宣言されていますが、その値は読み取られていません」
      • 原因: 宣言のみで利用箇所がない場合に発生
  • Type 'string' is not assignable to type 'number'.

    • 「型 'string' は型 'number' に割り当てられません」
      • 原因: actuallyStartsOnTimeにstring型を代入しているが、number型が要求されている
  • Consider using 'attendees' instead of 'atendees' for clarity.

    • 「'atendees'の代わりに'attendees'を使用してください」
      • 原因: スペルミス
  • 'agendaItem' can be declared as 'const' since it is never reassigned.

    • 「'agendaItem'は再代入されていないため、'const'で宣言できます」
      • 原因: letまたはvarで宣言しているが、再代入がない

改善案まとめ

  • 型定義・スペルミス・const指定の修正
  • バリデーションやエラーハンドリングの明確化
  • 型安全性と可読性向上のための インターフェース見直し
  • コメントやJSDocの追加による メンテナンス性向上

Reactコンポーネント設計のベストプラクティス

  • 型安全な設計
    • TypeScriptを活用し、PropsやStateの型を明示的に指定
  • 再利用性の高いコンポーネント
    • 汎用的なProps設計
  • 副作用管理
    • useEffectやuseCallbackの依存配列を適切に設定
  • ユーザー体験向上
    • バリデーションエラーやローディング状態の明示
  • 保守性
    • コードコメントや命名規則の統一

まとめ

  • 本コードは 会議スケジューラー の実装例
  • 型定義やスペルミスの修正が必要
  • エラー内容を理解し、 型安全性可読性 を重視してリファクタリング推奨
  • ReactとTypeScriptの ベストプラクティス に従った設計を心がける

Hackerたちの意見

なんか浅い感じがするけど、Zedを使わない理由の一つは、いいデフォルトのダークテーマがないことなんだよね。デフォルトのテーマは全部、低コントラストのグレーの組み合わせで、体験がなんか dull で魅力的じゃないんだよ。エディタ自体は素晴らしいのに。

これ試してみて!最近のお気に入りで、すごく洗練されてるよ: https://zed.dev/extensions/amp-theme

あなた一人じゃないし、Zedだけの問題でもないよ。ダークテーマは低コントラストのグレーの組み合わせが多いよね。私は普段、見た目が良いダークテーマを探して、それを元に背景色をもっと暗く、前景色を明るくしたカスタムバージョンを作るんだ。そろそろ、自分用だけじゃなくて、高コントラストのダークテーマを公開する時期かもね。

Zedの拡張ウィンドウでテーマを検索すれば、いい高コントラストのダークテーマをインストールするのに1分もかからないはずだよ。でも、あなたの言いたいことはわかる。いい高コントラストのダークテーマがいくつかあってもいいよね。

Zedは全体的にエンジニアがデザインした感じがして、あんまり良い意味ではないね。

やっと本当に高コントラストなテーマが手に入るかも。今の選択肢はそれに近いだけだからね。これは小さなことだけど、Zedはどんどん良いところを増やしていって、15年Vimを使った後に「面白い」から「自分のお気に入りのエディタ」に変わったよ。特に、gitの「フォローモード」は、開発でLLMを多用するのにすごく役立ってる。チームがどんどん小さなことを正しくやってくれてるのを見るのは嬉しいね。

Zedは「ほぼ完成」って感じ。テーマビルダーは良くて使いやすいし、数分で自分のテーマを作れたよ。構文の色付けはほぼ完璧だけど、まだ足りない部分がある(C/C++を使ってる)。UIのテキストの行間みたいな小さなビジュアル調整が、設定できる選択肢が少なすぎる(設定は2つだけ)。スクロールはスムーズなオプションがあればいいのに。何も妨げてないし、追加するのはすごく簡単なはず。コードを移動するとき、特に240Hzのモニターで見ると目に優しいんだよね。編集体験は良好で、起動も早いし、クラッシュもないし、反応も良いし、メモリもあまり食わない。

トラックパッドを使うとスクロールがめっちゃスムーズだよ。個人的には、クリックホイールはスクロールのレガシー技術だと思う(Windows使ってる時も、左手でMagic Trackpad使ってるから、アナログスクロールがスムーズなんだ)。

こういうのを見るとすごく嬉しい。Zedを何度も使おうとしたことがあるんだけど、ちょっと神経質に聞こえるかもしれないけど、私にとっては小さなテーマの違いが大きな影響を与えるんだ。例えば、https://imgur.com/a/ia2GCgg みたいに。上がVSCodeで、下がZed。どちらもSvelteを使って、似たようなテーマを使ってる。 - 山括弧の色が違う - 大文字のビルトインコンポーネントの色が違う - ブール値のプロパティの色が違う - 括弧の色がテキストと違う。インスペクタはゲームチェンジャーで、プレビューでこれらの特定のものをクリックするのがすごく役立つよ。

テーマに関することだけど、これは構文のハイライトだよね。テーマとは何の関係があるの?Zedユーザーじゃないけど、https://zed.dev/docs/reference/all-settings#colorize-bracket... で設定できるんじゃないかな。

ZedやSvelteは使ってないけど、Zedの画像を見る限り、Svelte用のtreesitterパーサーが欠けてるみたいだね。多くのエディタは基本的な正規表現ベースのハイライトをサポートしてて、拡張機能を使えばもっと高度なハイライトもできるよ。エディタがLanguage Server Protocolを使ってるなら、言語サーバーから提供されるセマンティックハイライトもあるかも。ウェブ検索で一つ拡張機能を見つけたけど、試してみた? https://zed.dev/extensions/svelte

Omarchyを使ってるなら、3.8のアップデートでZedのダイナミックテーマが追加されてるよ。すごくクールだよ: https://github.com/APS6/omazed

それはクールだね。でもDDHがあの人だってのが残念で、使う気になれない。

今のところZedで一番の問題は、MacOSでのフォントレンダリングがあんまり良くないこと。個人的にはSublime TextがMacでのフォントレンダリングは最高だと思ってる。Electronは年々少しずつ良くなってきたけど、Zedはフォントがイマイチなんだ。細すぎるか何かだね。

ノーブだって呼んでくれてもいいけど、左パネルのアイテムにマウスをホバーしたときに、右パネルのどの要素が影響を受けるか見えるといいな。今は何が変わったのか全然わからないよ :D

おお、すごいね。Zedを試してみたけど、色のスキームを設定しても、全体がgedit/gtksourceviewのクラシックな「コバルト」みたいにはならなかった。誰かがそんなテーマを作ってくれるなら、ちゃんとお金を払うつもりだよ。

実際、AIモデルにそんなテーマを作らせようとしたこともあったけど、全然うまくいかなかった!いつも間違ったものを生成するだけだった。うまくいくようになったら、めっちゃ興味ある!

既存のテーマの設定をちょっと調整するために使ってたんだけど、どのテーマトークンがどのUI要素に関連してるかを知るのにすごく役立ったよ。

確実にいい方向に進んでるね。Fleet(Jetbrainsのやつ)やZedみたいな新しいエディタは、テーマに関してはかなり足りない感じがしてたから。