TS/TESTS JAVA → GO →

TypeScript 5 / Node.js 22

TypeScriptの挙動を、
テストで確かめる。

説明より先に、実行できる仕様を見る。TypeScript by Tests は、Source と node:test を並べて読むための Executable Documentation です。

stringEquality.ts stringEquality.test.ts ✓
Source → Test / verified

The method

文章を長く読む前に、
テストの名前を読む。

01

Source

確認したい最小の TypeScript コードだけを置きます。

02

Test

node:test の assertion で、挙動をそのまま証明します。

03

Note

補足は短く。コードへ戻るためだけに使います。

Lesson catalog

まずは、50個の確かな挙動から。

50 / 50
01
Language

string: プリミティブ文字列の === は値を比較する

node:test 同じ内容の文字列は===で等しい

JavaScript の文字列はプリミティブ値であり、別経路で作った同じ内容の文字列は === で等しくなります。

Node.js 22+→
02
Language

string: trim 後の長さで空白だけを判定する

node:test 空白だけの文字列はisBlankでtrueになる

空文字と空白だけの文字列を同じ「未入力」として扱うなら、trim による正規化を明示します。

Node.js 22+→
03
Language

string: 連結は元の文字列を変更しない

node:test 文字列の連結は元の値を変更しない

文字列演算は新しい値を返すため、元の変数が指す文字列そのものは変わりません。

Node.js 22+→
04
Collections

Array: push は同じ配列を変更する

node:test pushすると元の配列に要素が追加される

mutable な Array では push が呼び出し元の配列を直接更新します。

Node.js 22+→
05
Collections

readonly: 型だけでは配列を実行時に凍結しない

node:test freezeした配列にはpushできない

readonly は TypeScript のコンパイル時契約であり、実行時の変更を止めるには Object.freeze が必要です。

TypeScript 5+→
06
Collections

Array: スプレッドによるコピーは浅い

node:test 浅いコピーでは要素オブジェクトを共有する

配列コンテナはコピーされますが、要素であるオブジェクトは共有されたままです。

Node.js 22+→
07
Collections

Map: キーがない時だけ既定値を登録する

node:test 存在しないキーには既定値が登録される

Map.has と Map.set を組み合わせ、存在しないキーにだけ初期値を保存します。

Node.js 22+→
08
Numbers

number: NaN は自分自身とも === で等しくない

node:test NaNは===では等しくない

NaN は通常の等価比較では判定できない特別な number 値です。

Node.js 22+→
09
Numbers

number: 0.1 + 0.2 は厳密な 0.3 にならない

node:test 小数の加算は厳密な0point3と等しくない

IEEE 754 の二進浮動小数点では、多くの十進小数を正確に表現できません。

Node.js 22+→
10
Language

object: 同じプロパティでも === は別の参照なら false

node:test 同じ座標を持つ別オブジェクトは===で等しくない

オブジェクトの === は値の形ではなく、同じオブジェクトへの参照かどうかを比較します。

Node.js 22+→
11
Language

Set: オブジェクトの重複判定は参照同一性で行う

node:test 別インスタンスの同じIDはSetで重複しない

Set は同じ形の別オブジェクトを自動で同じ値として扱いません。

Node.js 22+→
12
Functional

undefined: ?? で値がない場合だけ既定値を選ぶ

node:test undefinedの値は既定の表示名を返す

nullish coalescing は null または undefined のときだけ既定値を使います。

TypeScript 5+→
13
Functional

default: 引数は呼び出し前に評価され、supplier は必要時まで遅延できる

node:test 値があってもeagerな既定値の式は評価される

既定値を値として渡す呼び出しではその式が先に評価され、関数として渡せば必要な時だけ計算できます。

TypeScript 5+→
14
Functional

optional chaining: 値がない処理を連鎖で止める

node:test optional chainingは途中のundefinedで評価を止める

?. は null または undefined に到達した時点で評価を止め、undefined を返します。

TypeScript 5+→
15
Functional

Array: filter は新しい配列を返し、入力を変更しない

node:test filterは正の数だけを残す

filter は条件に合う要素だけを持つ新しい配列を返します。

Node.js 22+→
16
Functional

Array: map は呼び出した時点で評価される

node:test Arrayのmapは直ちにコールバックを評価する

Array の map は Stream と異なり、結果を要求する前でも直ちにコールバックを実行します。

Node.js 22+→
17
Functional

Object.freeze: 凍結は一段目だけに適用される

node:test freezeしたオブジェクトでも入れ子は変更できる

Object.freeze はトップレベルのプロパティを保護しますが、ネストしたオブジェクトを再帰的には凍結しません。

Node.js 22+→
18
Error Handling

Error: assert.throws で失敗の契約を確かめる

node:test ゼロで割るとRangeErrorが送出される

不正な入力に対して投げる Error の型を、テストで明示します。

Node.js 22+→
19
Error Handling

Result: TypeScriptには checked exception がない

node:test 不正なポートはResultのerrorを返す

回復可能な失敗を型で示したい場合、戻り値を discriminated union にします。

TypeScript 5+→
20
Generics

generics: readonly number[] は数値配列を読み取れる

node:test numberのreadonly配列を合計できる

読み取り専用の number 配列を受け取れば、呼び出し側の配列を変更せず合計できます。

TypeScript 5+→
21
Generics

generics: mutable な配列の共変性は不正な値を混入させ得る

node:test 広い要素型の配列APIはnumber配列へ文字列を追加できる

TypeScript では number[] を (number | string)[] として渡せるため、可変 API を設計するときは注意が必要です。

TypeScript 5+→
22
Date / Time

Date: 同じ instant でもタイムゾーンで日付が異なる

node:test 同じinstantはUTCとLosAngelesで日付が異なる

Date は時刻の一点を持ち、表示上の日付はフォーマット時に選んだタイムゾーンで決まります。

Node.js 22+→
23
Error Handling

try/finally: 成功時も失敗時も後片付けを行う

node:test withResourceは処理後にcloseを必ず呼ぶ

finally に close を置くことで、処理の成否にかかわらずリソースを解放できます。

Node.js 22+→
24
Collections

Map: オブジェクトキーはプロパティではなく参照で照合する

node:test 同じIDを持つ別オブジェクトではMapを検索できない

同じプロパティを持つ別オブジェクトは、Map の同じキーとして検索されません。

Node.js 22+→
25
Numbers

number: Math.round は負の 0.5 をゼロ方向へ丸める

node:test MathRoundの負の半端値はゼロ方向になる

Math.round の半端値処理は、常にゼロから遠ざける丸めではありません。

Node.js 22+→
26
Functional

?? と ||: 0 や空文字を既定値扱いするかが異なる

node:test ゼロはORでは既定値になるがnullishでは保持される

|| は falsy な値すべてを置き換えますが、?? は null と undefined だけを置き換えます。

TypeScript 5+→
27
Collections

Map: number の 1 と string の "1" は別のキー

node:test Mapはnumberとstringの同じ見た目のキーを区別する

Map はオブジェクトのプロパティ名への暗黙変換をせず、キーの型と値をそのまま区別します。

Node.js 22+→
28
Numbers

number: 十進数 0.1 は二進浮動小数点の近似値である

node:test 0point1を十進形式で十分長く表示すると近似値が見える

number へ入れた 0.1 は表示では短く見えても、内部では厳密な十進値ではありません。

Node.js 22+→
29
Functional

optional property: 省略、undefined、null は別の状態になり得る

node:test プロパティの不在とundefined値はin演算子で区別できる

外部入力ではプロパティがない状態と undefined・null の値を区別する必要があります。

TypeScript 5+→
30
Language

string: length は UTF-16 のコード単位を数える

node:test 絵文字はlengthでは2だがArrayFromでは1になる

絵文字などの補助文字は UTF-16 で 2 単位になり、見た目の文字数と length が一致しないことがあります。

Node.js 22+→
31
Language

string: 見た目が同じ Unicode 文字列でも === が異なる

node:test 正規化前は異なりNFC後は同じ文字列になる

合成済み文字と結合文字列は表示が同じでも別のコードポイント列です。

Node.js 22+→
32
Collections

Map: get の undefined だけでは未登録と undefined 値を区別できない

node:test getだけではundefined値のキーと未登録キーを区別できない

Map は undefined を値として保存できるため、キーの存在は has で確認します。

Node.js 22+→
33
Collections

const: 配列の再代入は防ぐが、要素の変更は防がない

node:test const配列には要素を追加できる

const は変数の束縛を固定するだけで、配列の内容を不変にはしません。

TypeScript 5+→
34
Functional

generator: iterator は一度進めた位置から再開する

node:test 消費したiteratorは二回目に最初から読めない

generator が返す iterator は状態を持ち、同じ iterator を二度走査しても最初からは始まりません。

Node.js 22+→
35
Date / Time

Date: 夏時間の切替をまたぐ日付境界は 24 時間ではない

node:test 夏時間開始日の二つの現地深夜は23時間離れている

America/Los_Angeles の夏時間開始日における二つの現地深夜は、23 時間しか離れていません。

Node.js 22+→
36
Language

Array: 同じ要素の別配列も === では等しくない

node:test 同じ要素の別配列は===で等しくならない

配列はオブジェクトなので、=== は内容ではなく同じ配列インスタンスかを比較します。

Node.js 22+→
37
Language

discriminated union: kind による網羅的な分岐を表す

node:test 支払い方法の全kindをswitchで分岐できる

閉じた状態集合は discriminated union と switch で表し、未知の状態を never として扱えます。

TypeScript 5+→
38
Concurrency

async: コンテキストを引数で明示して非同期処理へ渡す

node:test 非同期処理は明示的に渡したリクエストIDを返す

リクエスト固有の値を共有状態に置かず、関数引数として渡せば非同期処理の依存が明確になります。

Node.js 22+→
39
Concurrency

Promise: await は rejection の元の Error を送出する

node:test awaitはPromiseの失敗で元のErrorを送出する

await した Promise の rejection は、ラッパー例外ではなく rejection reason として受け取ります。

Node.js 22+→
40
Concurrency

Promise.all: 一つが失敗しても他の処理を自動では中止しない

node:test PromiseAllの失敗後も開始済み処理は完了する

Promise.all は最初の rejection で結果を失敗にしますが、開始済みの非同期処理をキャンセルしません。

Node.js 22+→
41
Generics

generics: 型引数は JavaScript 実行時には存在しない

node:test 異なる型引数の配列は実行時に同じArrayとして見える

TypeScript のジェネリクスはコンパイル時の仕組みであり、実行時には配列の要素型を判別できません。

TypeScript 5+→
42
Language

== と ===: 暗黙変換の有無が異なる

node:test == は比較前に空文字を数値へ変換するが、=== は型が異なればfalseになる

== は比較前に型変換を行い、=== は型と値の両方を比較します。

TypeScript 5+→
43
Concurrency

Promise.allSettled: 成功と失敗を両方観測する

node:test Promise.allSettled は成功と失敗を結果配列として両方返す

allSettledは一つが失敗しても全Promiseの結果を配列で返します。

ES2020+→
44
Language

private と #private: 実行時の隠蔽範囲が異なる

node:test privateは実行時プロパティとして書き換えられるが、#privateは外部から作れない

TypeScriptのprivateは型検査の制約で、#privateはJavaScript実行時にも外部アクセスを拒みます。

TypeScript 5+→
45
Generics

type guard: unknownを安全に絞り込む

node:test unknownはtypeof型ガードの後だけstringとして使える

unknownは型ガード後にだけ具体的な操作へ渡せます。

TypeScript 5+→
46
Generics

as const: 値をliteral型として保つ

node:test as constは配列要素をliteral unionとして保つ

as constは配列の要素を広いstringではなくliteral unionとして保持します。

TypeScript 5+→
47
Language

enum: numeric enumは実行時にもobjectとして残る

node:test numeric enumはJavaScript実行時に逆引き可能なobjectとして残る

numeric enumはJavaScriptへ出力され、数値から名前を逆引きできます。

TypeScript 5+→
48
Language

closure: 関数は作成時のローカル状態を保持する

node:test closureは作成時のローカル状態を呼び出し間で保持する

返した関数は外側のローカル変数を呼び出し後も参照します。

TypeScript 5+→
49
Collections

Set: NaNは同じ値として重複除去する

node:test SetはNaNを同じ値として重複除去する

NaN === NaNはfalseでも、SetはNaNを一つの要素として扱います。

ES2015+→
50
Language

Object.keys と for in: 継承プロパティの列挙が違う

node:test Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙する

Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙します。

ES2015+→

Static index

教材を検索

テーマ、タグ、テスト名、カテゴリ、Node.js・TypeScriptバージョンで絞り込みます。

50件の教材を表示しています。

Language · Node.js 22+string: プリミティブ文字列の === は値を比較する@Test 同じ内容の文字列は===で等しいLanguage · Node.js 22+string: trim 後の長さで空白だけを判定する@Test 空白だけの文字列はisBlankでtrueになるLanguage · Node.js 22+string: 連結は元の文字列を変更しない@Test 文字列の連結は元の値を変更しないCollections · Node.js 22+Array: push は同じ配列を変更する@Test pushすると元の配列に要素が追加されるCollections · TypeScript 5+readonly: 型だけでは配列を実行時に凍結しない@Test freezeした配列にはpushできないCollections · Node.js 22+Array: スプレッドによるコピーは浅い@Test 浅いコピーでは要素オブジェクトを共有するCollections · Node.js 22+Map: キーがない時だけ既定値を登録する@Test 存在しないキーには既定値が登録されるNumbers · Node.js 22+number: NaN は自分自身とも === で等しくない@Test NaNは===では等しくないNumbers · Node.js 22+number: 0.1 + 0.2 は厳密な 0.3 にならない@Test 小数の加算は厳密な0point3と等しくないLanguage · Node.js 22+object: 同じプロパティでも === は別の参照なら false@Test 同じ座標を持つ別オブジェクトは===で等しくないLanguage · Node.js 22+Set: オブジェクトの重複判定は参照同一性で行う@Test 別インスタンスの同じIDはSetで重複しないFunctional · TypeScript 5+undefined: ?? で値がない場合だけ既定値を選ぶ@Test undefinedの値は既定の表示名を返すFunctional · TypeScript 5+default: 引数は呼び出し前に評価され、supplier は必要時まで遅延できる@Test 値があってもeagerな既定値の式は評価されるFunctional · TypeScript 5+optional chaining: 値がない処理を連鎖で止める@Test optional chainingは途中のundefinedで評価を止めるFunctional · Node.js 22+Array: filter は新しい配列を返し、入力を変更しない@Test filterは正の数だけを残すFunctional · Node.js 22+Array: map は呼び出した時点で評価される@Test Arrayのmapは直ちにコールバックを評価するFunctional · Node.js 22+Object.freeze: 凍結は一段目だけに適用される@Test freezeしたオブジェクトでも入れ子は変更できるError Handling · Node.js 22+Error: assert.throws で失敗の契約を確かめる@Test ゼロで割るとRangeErrorが送出されるError Handling · TypeScript 5+Result: TypeScriptには checked exception がない@Test 不正なポートはResultのerrorを返すGenerics · TypeScript 5+generics: readonly number[] は数値配列を読み取れる@Test numberのreadonly配列を合計できるGenerics · TypeScript 5+generics: mutable な配列の共変性は不正な値を混入させ得る@Test 広い要素型の配列APIはnumber配列へ文字列を追加できるDate / Time · Node.js 22+Date: 同じ instant でもタイムゾーンで日付が異なる@Test 同じinstantはUTCとLosAngelesで日付が異なるError Handling · Node.js 22+try/finally: 成功時も失敗時も後片付けを行う@Test withResourceは処理後にcloseを必ず呼ぶCollections · Node.js 22+Map: オブジェクトキーはプロパティではなく参照で照合する@Test 同じIDを持つ別オブジェクトではMapを検索できないNumbers · Node.js 22+number: Math.round は負の 0.5 をゼロ方向へ丸める@Test MathRoundの負の半端値はゼロ方向になるFunctional · TypeScript 5+?? と ||: 0 や空文字を既定値扱いするかが異なる@Test ゼロはORでは既定値になるがnullishでは保持されるCollections · Node.js 22+Map: number の 1 と string の "1" は別のキー@Test Mapはnumberとstringの同じ見た目のキーを区別するNumbers · Node.js 22+number: 十進数 0.1 は二進浮動小数点の近似値である@Test 0point1を十進形式で十分長く表示すると近似値が見えるFunctional · TypeScript 5+optional property: 省略、undefined、null は別の状態になり得る@Test プロパティの不在とundefined値はin演算子で区別できるLanguage · Node.js 22+string: length は UTF-16 のコード単位を数える@Test 絵文字はlengthでは2だがArrayFromでは1になるLanguage · Node.js 22+string: 見た目が同じ Unicode 文字列でも === が異なる@Test 正規化前は異なりNFC後は同じ文字列になるCollections · Node.js 22+Map: get の undefined だけでは未登録と undefined 値を区別できない@Test getだけではundefined値のキーと未登録キーを区別できないCollections · TypeScript 5+const: 配列の再代入は防ぐが、要素の変更は防がない@Test const配列には要素を追加できるFunctional · Node.js 22+generator: iterator は一度進めた位置から再開する@Test 消費したiteratorは二回目に最初から読めないDate / Time · Node.js 22+Date: 夏時間の切替をまたぐ日付境界は 24 時間ではない@Test 夏時間開始日の二つの現地深夜は23時間離れているLanguage · Node.js 22+Array: 同じ要素の別配列も === では等しくない@Test 同じ要素の別配列は===で等しくならないLanguage · TypeScript 5+discriminated union: kind による網羅的な分岐を表す@Test 支払い方法の全kindをswitchで分岐できるConcurrency · Node.js 22+async: コンテキストを引数で明示して非同期処理へ渡す@Test 非同期処理は明示的に渡したリクエストIDを返すConcurrency · Node.js 22+Promise: await は rejection の元の Error を送出する@Test awaitはPromiseの失敗で元のErrorを送出するConcurrency · Node.js 22+Promise.all: 一つが失敗しても他の処理を自動では中止しない@Test PromiseAllの失敗後も開始済み処理は完了するGenerics · TypeScript 5+generics: 型引数は JavaScript 実行時には存在しない@Test 異なる型引数の配列は実行時に同じArrayとして見えるLanguage · TypeScript 5+== と ===: 暗黙変換の有無が異なる@Test == は比較前に空文字を数値へ変換するが、=== は型が異なればfalseになるConcurrency · ES2020+Promise.allSettled: 成功と失敗を両方観測する@Test Promise.allSettled は成功と失敗を結果配列として両方返すLanguage · TypeScript 5+private と #private: 実行時の隠蔽範囲が異なる@Test privateは実行時プロパティとして書き換えられるが、#privateは外部から作れないGenerics · TypeScript 5+type guard: unknownを安全に絞り込む@Test unknownはtypeof型ガードの後だけstringとして使えるGenerics · TypeScript 5+as const: 値をliteral型として保つ@Test as constは配列要素をliteral unionとして保つLanguage · TypeScript 5+enum: numeric enumは実行時にもobjectとして残る@Test numeric enumはJavaScript実行時に逆引き可能なobjectとして残るLanguage · TypeScript 5+closure: 関数は作成時のローカル状態を保持する@Test closureは作成時のローカル状態を呼び出し間で保持するCollections · ES2015+Set: NaNは同じ値として重複除去する@Test SetはNaNを同じ値として重複除去するLanguage · ES2015+Object.keys と for in: 継承プロパティの列挙が違う@Test Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙する