Skip to content

refactor(types): consolidate "as unknown as" casts in OAuth wiring #148

@liplus-lin-lay

Description

@liplus-lin-lay

purpose

as unknown as 型キャストが現状 8 箇所散在 (OAuth wiring 6 + Vectorize metadata 1 + Workers AI response 1)。 OAuth wiring 部の 6 箇所は oauth.ts 内に境界を 1 ヶ所に集約し、 call site (index.ts) は cast-free にする。 mcp.ts / rerank.ts の 2 箇所は外部ライブラリ (Vectorize / Workers AI) の型定義不足が原因のため、 本 issue では対象外として据え置き。

premise

  • as unknown as は型システムの完全 escape hatch。 散在するとコンパイラ保護が外れ、 OAuthProvider 仕様変更時の追従が困難になる
  • oauth.ts は既に OAuthEnv / GitHubUserProps 等を export しており、 OAuth 境界の自然な所在地である
  • Cloudflare @cloudflare/workers-oauth-providerExportedHandler<OAuthEnv & Record<string, unknown>> を要求する。 この Record<string, unknown> index signature の付与が現在 index.ts L174 / L179 のキャスト原因
  • ctx.props の shape 変換 (GitHubUserProps → McpProps) が index.ts L130 / L137 のキャスト原因
  • env から OAUTH_PROVIDER helper の取り出しが index.ts L149 / L157 のキャスト原因

constraints

  • 動作変更なし (refactor のみ)
  • OAuth エンドポイント / OAuthProvider 設定 / token TTL は無変更
  • 既存 export interface (GitHubUserProps, OAuthEnv) は無変更
  • 既存 createOAuthProvider の signature 変更は許容するが、 呼び出し側 (index.ts) 内のみ修正で完結すること

target files

  • src/oauth.ts — 型 + helper 追加、 createOAuthProvider を generic 化
  • src/types.tsEnvOAuthEnv extends に変更 (structural 互換性の明示)
  • src/index.ts — call site 6 箇所を helper / generic-typed 呼び出しに置換

scope (この issue で対応)

in scope

  • src/index.ts L130 / L137 / L149 / L157 / L174 / L179 の 6 OAuth-wiring cast 解消
  • src/oauth.ts に 3 helper (readGitHubProps / writeMcpProps / readOAuthHelpers) + 1 type (McpProps) export 追加
  • createOAuthProvider<TEnv extends OAuthEnv> generic 化
  • Env extends OAuthEnv 宣言追加

out of scope (別 issue 候補)

  • src/mcp.ts L719 m.metadata as unknown as VectorMetadata | undefined — Vectorize 型定義不足
  • src/rerank.ts L157 as unknown as RerankerResponse — Workers AI 型定義不足

expected outcome

grep "as unknown as" src/ の結果が 8 → 2 (library 起因のみ残る)。 oauth.ts 内 boundary に 5 cast 集約 (型 escape hatch を 1 ファイルに局所化)。

label

  • type: enhancement
  • maturity: ready

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancement新機能・改善要望ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions