Upgrade to Pro — share decks privately, control downloads, hide ads and more …

slow types ってなんだろう?

slow types ってなんだろう?

JSR Meetup - connpass https://deno-ja.connpass.com/event/316018/ で発表する資料です

- slow types とは何か
- jsr publish をすると何が起きるのか (※ slow types 観点)
- slow types の検出

kazuhiro hara

May 03, 2024
Tweet

More Decks by kazuhiro hara

Other Decks in Programming

Transcript

  1. slow types ってなんだろう? JSR Meetup 2024-05-03 (fri) Copyright © 2024

    Kansock.Industries 原 一浩 (Kazuhiro Hara) / @kara_d
  2. slow types について • About "slow types" というドキュメントが Reference にある

    ◦ About "slow types" - Docs - JSR https://jsr.io/docs/about-slow-types
  3. slow types ってなんだろう? • JSR は TypeScript の型を分析して以下のことをしている ◦ ドキュメントの生成

    ◦ npm との互換のためのレイヤーの型宣言を生成 ◦ Deno プロジェクトの型チェックを高速化 • slow types に該当するもの ◦ 明示的な型宣言がない ◦ 広範囲な推論を必要とする ▪ 単純な推論なら OK • 関数本体が単一の単純な式である、アロー関数の戻り値の型 • 単純な式で初期化される変数 (const や let) またはプロパティの型 • slow types な宣言や参照をなくしましょう ◦ 関数、クラス、インターフェース、変数、型エイリアス
  4. slow types を含むパッケージがあると... • パッケージを使って開発する人が型チェックに時間がかかる場合がある ◦ 速度の低下は少なくとも 1.5​​ ~ 2

    倍程度 ◦ 大幅に高くなる場合も • npm 互換レイヤーの型宣言を生成できなくなるか any 型がつかわれる • パッケージのドキュメントを生成できない、 もしくは生成されたドキュメントで slow types な API が省略される
  5. slow types のありがちな疑問 • slow types を利用していたら publish できない? ◦

    どうしてもな時は --allow-slow-types を指定する ◦ zod や様々なライブラリを使ったパッケージを作る場合にお世話になりそう • すべてで型宣言が必要? ◦ export しない関数や変数、ローカルスコープのものはチェックされない ▪ 試してみたところ、問題はなかった ▪ 別のチェックでひっかかる可能性はある
  6. slow types に関する議論など • "Slow types" feel opinionated · Issue

    #444 · jsr-io/jsr https://github.com/jsr- io/jsr/issues/444 • Explicit typing on consts? · jsr-io/jsr · Discussion #447 https://github.com/jsr- io/jsr/discussions/447 • Show no-slow-types diagnostics in the LSP · Issue #22437 · denoland/deno https://github.com/denoland/deno/issues/22437 • Give better error message when ignoring no-slow-types with deno-lint-ignore · Issue #23182 · denoland/deno https://github.com/denoland/deno/issues/23182 • jsr: no slow types requirement makes zod exports unusable · Issue #23126 · denoland/deno https://github.com/denoland/deno/issues/23126
  7. jsr publish をすると何が起きるのか • jsr-npm パッケージのコードを観てみる ◦ jsr-io/jsr-npm: A cli

    tool to make installing packages form jsr.io in node easy https://github.com/jsr-io/jsr-npm/tree/main
  8. publish コマンドの処理を追う • publish コマンドの処理はここ ◦ jsr-npm/src/bin.ts at main ·

    jsr-io/jsr-npm https://github.com/jsr-io/jsr- npm/blob/main/src/bin.ts#L146 • 実際の処理はこちら ◦ jsr-npm/src/commands.ts at main · jsr-io/jsr-npm https://github.com/jsr-io/jsr- npm/blob/main/src/commands.ts#L163
  9. npm パッケージ向けの対応が入っている • npm のとき以下を追加 (package.json があるかどうかを見ている) ◦ --unstable-bare-node-builtins ▪

    Node.jsの組み込みパッケージを node: なしで import する ◦ --unstable-sloppy-imports ▪ あいまいな import を可能にする ◦ --unstable-byonm ▪ BYONM (Bring your own node_modules) を有効化 ◦ --no-check ▪ 型チェックしない • 追加でこちらも環境変数に追加 ◦ env.DENO_DISABLE_PEDANTIC_NODE_WARNINGS = "true"; • 実際には deno publish を呼び出している
  10. slow types の検出 (1) • --dry-run をつける $ npx jsr

    publish --dry-run Check file:///home/karad/study/jsr/greet/mod.ts Checking for slow types in the public API... error[missing-explicit-return-type]: missing explicit return type in the public API --> /home/karad/study/jsr/greet/mod.ts:16:17 | 16 | export function greet(name: string) { | ^^^^^ this function is missing an explicit return type = hint: add an explicit return type to the function info: all functions in the public API must have an explicit return type docs: https://jsr.io/go/slow-type-missing-explicit-return-type This package contains errors for slow types. Fixing these errors will: 1. Significantly improve your package users' type checking performance. 2. Improve the automatic documentation generation. 3. Enable automatic .d.ts generation for Node.js. Don't want to bother? You can choose to skip this step by providing the --allow-slow-types flag. error: Found 1 problem
  11. slow types の検出 (2) • deno.json に name, verison, exports

    があるとチェックが走るのを利用 ◦ deno.json configuration file | Deno Docs https://docs.deno.com/runtime/manual/getting_started/configuration_file • lint コマンドをつかう $ deno lint --config jsr.json $ deno lint --config jsr.json error[no-slow-types]: missing explicit type in the public API --> /home/karad/study/jsr/greet/mod.ts:25:14 | 25 | export const GLOBAL_ID = crypto.randomUUID(); | ^^^^^^^^^ this symbol is missing an explicit type = hint: add an explicit type annotation to the symbol info: all symbols in the public API must have an explicit type docs: https://jsr.io/go/slow-type-missing-explicit-type Found 1 problem Checked 1 file
  12. まとめ • slow types な宣言や参照があると JSR の機能を フルで利用できない場合があります • jsr

    publish をすると Deno 側でチェックが走ります • パブリッシュ前に slow types をチェックしましょう
  13. slow types ってなんだろう JSR Meetup 2024-05-03(fri) Copyright © 2024 Kansock.Industries

    原 一浩 (Kazuhiro Hara) / @kara_d ありがとうございました!