Source
確認したい最小の TypeScript コードだけを置きます。
TypeScript 5 / Node.js 22
説明より先に、実行できる仕様を見る。TypeScript by Tests は、Source と node:test を並べて読むための Executable Documentation です。
The method
確認したい最小の TypeScript コードだけを置きます。
node:test の assertion で、挙動をそのまま証明します。
補足は短く。コードへ戻るためだけに使います。
First proof
JavaScript の文字列はプリミティブ値であり、別経路で作った同じ内容の文字列は === で等しくなります。
export function sameText(left: string, right: string): boolean {
return left === right;
}import assert from "node:assert/strict";
import test from "node:test";
import { sameText } from "../../src/string/stringEquality.js";
test("同じ内容の文字列は===で等しい", () => {
assert.equal(sameText("Type", ["Ty", "pe"].join("")), true);
});Lesson catalog
JavaScript の文字列はプリミティブ値であり、別経路で作った同じ内容の文字列は === で等しくなります。
Node.js 22+→02空文字と空白だけの文字列を同じ「未入力」として扱うなら、trim による正規化を明示します。
Node.js 22+→03文字列演算は新しい値を返すため、元の変数が指す文字列そのものは変わりません。
Node.js 22+→04mutable な Array では push が呼び出し元の配列を直接更新します。
Node.js 22+→05readonly は TypeScript のコンパイル時契約であり、実行時の変更を止めるには Object.freeze が必要です。
TypeScript 5+→06配列コンテナはコピーされますが、要素であるオブジェクトは共有されたままです。
Node.js 22+→07Map.has と Map.set を組み合わせ、存在しないキーにだけ初期値を保存します。
Node.js 22+→08NaN は通常の等価比較では判定できない特別な number 値です。
Node.js 22+→09IEEE 754 の二進浮動小数点では、多くの十進小数を正確に表現できません。
Node.js 22+→10オブジェクトの === は値の形ではなく、同じオブジェクトへの参照かどうかを比較します。
Node.js 22+→11Set は同じ形の別オブジェクトを自動で同じ値として扱いません。
Node.js 22+→12nullish coalescing は null または undefined のときだけ既定値を使います。
TypeScript 5+→13既定値を値として渡す呼び出しではその式が先に評価され、関数として渡せば必要な時だけ計算できます。
TypeScript 5+→14?. は null または undefined に到達した時点で評価を止め、undefined を返します。
TypeScript 5+→15filter は条件に合う要素だけを持つ新しい配列を返します。
Node.js 22+→16Array の map は Stream と異なり、結果を要求する前でも直ちにコールバックを実行します。
Node.js 22+→17Object.freeze はトップレベルのプロパティを保護しますが、ネストしたオブジェクトを再帰的には凍結しません。
Node.js 22+→18不正な入力に対して投げる Error の型を、テストで明示します。
Node.js 22+→19回復可能な失敗を型で示したい場合、戻り値を discriminated union にします。
TypeScript 5+→20読み取り専用の number 配列を受け取れば、呼び出し側の配列を変更せず合計できます。
TypeScript 5+→21TypeScript では number[] を (number | string)[] として渡せるため、可変 API を設計するときは注意が必要です。
TypeScript 5+→22Date は時刻の一点を持ち、表示上の日付はフォーマット時に選んだタイムゾーンで決まります。
Node.js 22+→23finally に close を置くことで、処理の成否にかかわらずリソースを解放できます。
Node.js 22+→24同じプロパティを持つ別オブジェクトは、Map の同じキーとして検索されません。
Node.js 22+→25Math.round の半端値処理は、常にゼロから遠ざける丸めではありません。
Node.js 22+→26|| は falsy な値すべてを置き換えますが、?? は null と undefined だけを置き換えます。
TypeScript 5+→27Map はオブジェクトのプロパティ名への暗黙変換をせず、キーの型と値をそのまま区別します。
Node.js 22+→28number へ入れた 0.1 は表示では短く見えても、内部では厳密な十進値ではありません。
Node.js 22+→29外部入力ではプロパティがない状態と undefined・null の値を区別する必要があります。
TypeScript 5+→30絵文字などの補助文字は UTF-16 で 2 単位になり、見た目の文字数と length が一致しないことがあります。
Node.js 22+→31合成済み文字と結合文字列は表示が同じでも別のコードポイント列です。
Node.js 22+→32Map は undefined を値として保存できるため、キーの存在は has で確認します。
Node.js 22+→33const は変数の束縛を固定するだけで、配列の内容を不変にはしません。
TypeScript 5+→34generator が返す iterator は状態を持ち、同じ iterator を二度走査しても最初からは始まりません。
Node.js 22+→35America/Los_Angeles の夏時間開始日における二つの現地深夜は、23 時間しか離れていません。
Node.js 22+→36配列はオブジェクトなので、=== は内容ではなく同じ配列インスタンスかを比較します。
Node.js 22+→37閉じた状態集合は discriminated union と switch で表し、未知の状態を never として扱えます。
TypeScript 5+→38リクエスト固有の値を共有状態に置かず、関数引数として渡せば非同期処理の依存が明確になります。
Node.js 22+→39await した Promise の rejection は、ラッパー例外ではなく rejection reason として受け取ります。
Node.js 22+→40Promise.all は最初の rejection で結果を失敗にしますが、開始済みの非同期処理をキャンセルしません。
Node.js 22+→41TypeScript のジェネリクスはコンパイル時の仕組みであり、実行時には配列の要素型を判別できません。
TypeScript 5+→42== は比較前に型変換を行い、=== は型と値の両方を比較します。
TypeScript 5+→43allSettledは一つが失敗しても全Promiseの結果を配列で返します。
ES2020+→44TypeScriptのprivateは型検査の制約で、#privateはJavaScript実行時にも外部アクセスを拒みます。
TypeScript 5+→45unknownは型ガード後にだけ具体的な操作へ渡せます。
TypeScript 5+→46as constは配列の要素を広いstringではなくliteral unionとして保持します。
TypeScript 5+→47numeric enumはJavaScriptへ出力され、数値から名前を逆引きできます。
TypeScript 5+→48返した関数は外側のローカル変数を呼び出し後も参照します。
TypeScript 5+→49NaN === NaNはfalseでも、SetはNaNを一つの要素として扱います。
ES2015+→50Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙します。
ES2015+→