Slide 1

Slide 1 text

slow types ってなんだろう? JSR Meetup 2024-05-03 (fri) Copyright © 2024 Kansock.Industries 原 一浩 (Kazuhiro Hara) / @kara_d

Slide 2

Slide 2 text

はなすひと ● 原 一浩 (Kazuhiro Hara) / カンソクインダストリーズ / @kara_d Web Design Trends Design & Develop Media XR (AR / MR)

Slide 3

Slide 3 text

本日の構成 ● slow types とは何か ● jsr publish をすると何が起きるのか (※ slow types 観点) ● slow types の検出 ● まとめ

Slide 4

Slide 4 text

slow types とは

Slide 5

Slide 5 text

slow types について ● About "slow types" というドキュメントが Reference にある ○ About "slow types" - Docs - JSR https://jsr.io/docs/about-slow-types

Slide 6

Slide 6 text

slow types ってなんだろう? ● JSR は TypeScript の型を分析して以下のことをしている ○ ドキュメントの生成 ○ npm との互換のためのレイヤーの型宣言を生成 ○ Deno プロジェクトの型チェックを高速化 ● slow types に該当するもの ○ 明示的な型宣言がない ○ 広範囲な推論を必要とする ■ 単純な推論なら OK ● 関数本体が単一の単純な式である、アロー関数の戻り値の型 ● 単純な式で初期化される変数 (const や let) またはプロパティの型 ● slow types な宣言や参照をなくしましょう ○ 関数、クラス、インターフェース、変数、型エイリアス

Slide 7

Slide 7 text

slow types を含むパッケージがあると... ● パッケージを使って開発する人が型チェックに時間がかかる場合がある ○ 速度の低下は少なくとも 1.5​​ ~ 2 倍程度 ○ 大幅に高くなる場合も ● npm 互換レイヤーの型宣言を生成できなくなるか any 型がつかわれる ● パッケージのドキュメントを生成できない、 もしくは生成されたドキュメントで slow types な API が省略される

Slide 8

Slide 8 text

slow types のありがちな疑問 ● slow types を利用していたら publish できない? ○ どうしてもな時は --allow-slow-types を指定する ○ zod や様々なライブラリを使ったパッケージを作る場合にお世話になりそう ● すべてで型宣言が必要? ○ export しない関数や変数、ローカルスコープのものはチェックされない ■ 試してみたところ、問題はなかった ■ 別のチェックでひっかかる可能性はある

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

jsr publish をすると何が起きるのか ※ slow types 観点

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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 を呼び出している

Slide 14

Slide 14 text

slow types の検出

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

まとめ

Slide 18

Slide 18 text

まとめ ● slow types な宣言や参照があると JSR の機能を フルで利用できない場合があります ● jsr publish をすると Deno 側でチェックが走ります ● パブリッシュ前に slow types をチェックしましょう

Slide 19

Slide 19 text

slow types ってなんだろう JSR Meetup 2024-05-03(fri) Copyright © 2024 Kansock.Industries 原 一浩 (Kazuhiro Hara) / @kara_d ありがとうございました!