JavaScript/TypeScript

TypeScriptの新しめの型

index signature インデックス型: {[k : T] : S} の形で書ける型 いや違う、オブジェクト型やマップ型のインデックス集合の型を index signature と言っているのかな。 indexed access 型: T[K] という二項の型演算、または型演算で作られる型。特定の型や…

TypeScriptの型述語、型ガード、型アサーション関数、その他

例によって用語がややこしい。 型述語は、value is string のような構文。タイピング述語、タイピング関係といったほうが良いが、「型述語」。これは、型ガード関数や型アサーション関数の戻り値位置に書く形式。 型ガードが実は述語〈ブール値をとる関数〉…

TypeScriptコンストラクタの便利速記構文

Constructor Assignment と呼ぶようだ。いつもの決まりきった書き方を短く書ける。 interface Container { context : Bunch; outcome : Wire | null; } class Stage implements Container { constructor(public context : Bunch, public outcome: Wire | nul…

object, Object, {}

Objectはオブジェクト型だけでなくて、ボクシングしてオブジェクトになるものも含まれる。null以外なんでもいい。{} が Object と同義なのは、どうかしている。object は {[key: (string|number)] : any} と同義かな? たぶん。いずれにしても整合性がない。

TypeScriptの型定義

TypeScriptの型定義がすごい進化しているな。 type Props = { name: string, [key: string]: any }; type Props2 = { name: string, } & { [key in string]: any }; JavaScriptのcomputed property names と Mapped types もある。使えるぞ。次の型表現は期…

デリゲーションのヘルパーの“知り方”

デリゲーション・パターンにおいて、仕事の依頼主をクライアント(またはカスタマー)、依頼される先である代理業者をヘルパーと呼ぶことにする。掃除代行業者とかがヘルパーだと思えばよい。 ヘルパーの仕様記述 ヘルパーが何ができるかは、インターフェー…

JsDocのミクシン

mixinタグ @mixin [<MixinName>] A mixin provides functionality that is intended to be added to other objects. If desired, you can use the @mixin tag to indicate that an object is a mixin. You can then add the @mixes tag to objects that use the mixin.</mixinname>…

scriptタグによるJSファイルのロード

https://html.spec.whatwg.org/multipage/scripting.html からの図(asyncdefer.svg):わかりやすいし示唆に富んでいる。 <script> は書いた順にロード(フェッチ&パーズ&実行)される。したがって、実行順は保証される。 <script> は、メインスレッド(HTMLパーズ&描画…

Viteスキャフォールド: JS と TS

次のコマンドを実行する: npm create vite@latest 。次のオプションを選ぶ。 Vanilla, JavaScript Vanilla, TypeScript PowerShellのデフォルトだと、画面の文字が一部読めない。wt とか cmd.exe がいいかも。JavaScript と TypeScript の場合で比較してみ…

モジュールシステムの錯綜

本編の JavaScriptは2つの言語になったんだね - 檜山正幸のキマイラ飼育記 (はてなBlog), CommonJSは遠からず消滅するだろう - 檜山正幸のキマイラ飼育記 (はてなBlog) でも書いたが、現状のモジュールシステムは錯綜していて鬱陶しい。将来的にはESM方式に…

TypeScriptのCJSモジュール

グローバルモジュールと内部モジュール〈名前空間〉は述べた。 TypeScriptグローバルモジュール - (新) 檜山正幸のキマイラ飼育記 メモ編 TypeScript内部モジュール - (新) 檜山正幸のキマイラ飼育記 メモ編 CJSモジュールも僕は使いたくはないが、実際はま…

HTML scriptタグとモジュール

コードが書いてあるファイルへの参照と、コードのインライン埋め込みが同じタグだったのは気にいらないが、それを言っても詮無いこと。 参照なら: src 属性を付けて要素内容は空。 埋め込みなら: src 属性を付けずに、要素内容に書く。 nomodule属性(存在…

TypeScript内部モジュール

今は「名前空間〈namespace〉」に変わり、これも推奨はされてないようだが、内部モジュールという仕掛けもある。グローバルモジュール(include方式)も内部モジュールも、ESM以前のナンチャッテモジュールのメカニズムを採用している。手動で書いていた var…

TypeScriptグローバルモジュール

モジュールロード/非モジュールロード - (新) 檜山正幸のキマイラ飼育記 メモ編 の続き。今は非推奨の古い方式だが、TypeScriptのimport構文もどきがある。 /// <reference path="lib-foo.ts"> /* main.ts */ C言語の include に近い。コンパイル時に lib-foo.ts の内容が見える。一応、</reference>…

モジュールロード/非モジュールロード

古い方式: <script src="lib-common.js"> <script src="lib-foo.js"> <script src="lib-bar.js"> <script src="main.js"> 直接的依存関係は(仮定): main → lib-foo main → lib-bar lib-foo → lib-common lib-bar → lib-common scriptタグの並びを見ても依存方向/依存可能性は分かるが、ほんとの依存関係は分からない。次のようにすればハッキリする。 main で …

scriptタグとモジュール/非モジュール

古いブラウザには読ませない、モジュールロード構文 : <script type="module" src="パス"></script> 新しいブラウザには読ませない、非モジュールロード構文 : <script nomodule src="パス"></script> 新旧共通の非モジュールロード構文: <script src="パス"></script> モジュールコードはモジュールオブジェクト=関数フレーム(スタックではなくヒープだが)内で実行…

ベテラン(?)の意見

Quoraの「TypeScriptって気持ち悪くないですか?」なる質問に、以下のコードと共に: Aだと変数aに代入するときにエラーにならないのですが、Bだと変数aに代入するときに型のエラーになるんです。 え、なんで?同じ動きしているはずなのに。 const getA = ()…

TypeScriptのdeclare

declare は実はどこに書いてもいい。.d.tsファイルじゃなくてもいい。が、アンビエント宣言だけ切り離してまとめておいたほうがいいので、.d.tsファイルがある。.d.ts ファイルに関する特別な扱いの規約・メカニズムも整備されている。 declare var -- 変数…

SVG.js (3)

(1) (2) なんか面白い、作者 Fuzzyma〈Ulrich-Matthias Schäfer〉の発想が面白い。 WantToDo指向 「何をするか/したいか」に注目する発想をWantToDo指向とでも呼べば、FuzzymaはWantToDo指向で、次のToDo〈Doing〉を設定している。 creating オブジェクトを…

SVG.js (2)

https://svgjs.dev/docs/3.0/events/ を読んで。文書を読むと次のように読める。null = {null}。 signature Element { sort self operation click: (self, ClickHandler) → self operation click: (self, null) → self }同じような方式で、dblclick, mousedo…

SVG.js (1)

まず重大な注意: npm i svg.js と npm i @svgdotjs/svg.js では違うものがインストールされる。 Plumb > npm list +-- @svgdotjs/svg.js@3.1.2 +-- @types/jest@28.1.4 +-- @types/node@18.0.3 `-- svg.js@2.7.1 svg.js は開発が止まっているかも知れない。…

補足: NPMによるスキャフォールド

NPMによるスキャフォールド - (新) 檜山正幸のキマイラ飼育記 メモ編 の続き。npx ≡ npm exec の一時インストール先だが、Linux で ~/.npm/_npx/ らしいがWindowsでは %USERPROFILE%/AppData/Local/npm-cache/_npx/ ここを見ると確かにパッケージがインスト…

NPMによるスキャフォールド

最近は、NPMだけでプロジェクトのスキャフォールディングができるようだ。例えば、vite〈ヴィート〉のセットアップは: npm create vite@latestnpm create は npm init の別名〈エイリアス〉、i.e. npm create <initializer> ≡ npm init <initializer> 。npm init のマニュアルは: htt</initializer></initializer>…

動くかな?

<html> <head> <meta charset="UTF-8" /> <title>Import JSON</title> </head> <body> <script type="module"> import myJson from './external.json' assert {type: 'json'}; console.dir(myJson); </script> </body> </html> いくつか問題がある。 import/assert はまだ対応してないかも知れない。assertなしでも、拡張子で判断してJSONファイルをインポー…

続・Web開発のツール

全ての道はRomeへ続くのか - これからのJavascript開発を考える に、Rome の情報あり。そこにあったツールの分類: トランスパイラ(Babel,esbuild,SWC) バンドラ(webapck,Parcel,rollup) 型チェック(Typescript,flow) リンター(ESLint) フォーマッタ…

SVGのテスト

DOMツリーが完了しないと、DOM操作はうまくいかないが、この程度だとbodyの最後にscriptを書けば問題ないようだ。 <html> <head><title>SVG Test</title></head> <body> <h1>Hello SVG</h1> <script> const svgNS = "http://www.w3.org/2000/svg"; var body = (document.getElementsByTagName("body"))[0]; var svg = </body></html>…

Web開発のツール

ツールの分類が難しい。境界線がハッキリしないし、実際複数の役割を兼務しているソフトウェアが多そうだ。つまり、だいぶ機能重複があるってこと。 バンドラー: 複数のファイルをまとめて単一または少数のファイルにする。 互換性トランスパイラ: JavaScr…

jsPlumb (3)

比較的に概念的な話、雑多: HTML element と DOM node は同義語だと思ってよい。 connect elements とは、DOMノードを繋ぐ行為。 コネクションという名詞は、繋がれた要素/ノード達からなる構造物を指す名詞。 コネクションを作る行為を表す動詞が connect…

jsPlumb (2)

概念編: コネクションがjsPlumbの中心概念。コネクションは次の相互依存した5つの概念にブレークダウンされる。 アンカー エンドポイント コネクター オーバーレイ グループ 言葉の響きと違う意味もあるので注意(いつものことだが)。 Graphvizとの対比で…

jsPlumb (1)

コミュニティバージョンと有償バージョンあり。コミュニティバージョンのドキュメントは https://docs.jsplumbtoolkit.com/community 。サンプルの一枚HTMLは: https://gist.github.com/productivity-for-programmers/6ef09ef5ccd5ab62a2d259d4c7260376 パ…