JavaScript・TypeScript実務 問題集・練習問題クイズ

収録問題 40問 / 10問ランダム出題

JavaScript実行モデル 非同期処理 DOM・Module・Security TypeScript型設計 Narrowing Generic Build構成
JavaScript・TypeScript実務の10問クイズに挑戦

ランダムに出題・即時フィードバック・間違えた問題の復習機能付き

クイズをはじめる →

JavaScript・TypeScript実務のおすすめ教材を見る →

収録テーマ一覧(全40問)

Q1

APIから得たIDが文字列か数値かを区別して比較したい。JavaScriptで適切な演算子はどれですか?

答え: 厳密等価演算子 ===

===は型変換を行わずに型と値を比較するため、文字列の"1"と数値の1を別物として扱えます。境界で型を正規化する設計も有効です。

Q2

設定値として0を有効な値にし、nullまたはundefinedのときだけ既定値を使いたい。適切なのはどれですか?

答え: value ?? defaultValue

Nullish Coalescingは左辺がnullまたはundefinedの場合だけ右辺を返します。||は0、空文字、falseも既定値へ置き換えます。

Q3

Loop内で非同期Callbackを作り、各反復時のIndexを保持したい。適切な宣言はどれですか?

答え: for文のIndexをletで宣言する

letはfor Loopの反復ごとに新しいBindingを作るため、Closureはその反復の値を保持します。varは一つのBindingを共有します。

Q4

Object Method内でsetTimeoutを使い、Method呼出し時のthisを参照したい。適切なのはどれですか?

答え: setTimeoutへArrow Functionを渡す

Arrow Functionは独自のthisを持たず、外側のMethod Contextを字句的に参照します。通常Functionのthisは呼出し方で決まります。

Q5

同期処理、Promise.then、setTimeout(fn, 0)を同時に登録した。一般的な実行順序はどれですか?

答え: 同期処理、PromiseのMicrotask、TimerのTask

現在のCall Stackが完了した後、Microtask Queueを処理し、その後にTimerなど次のTaskへ進みます。長いMicrotask連鎖は描画やTaskを遅らせます。

Q6

独立した3つのAPIを並行実行し、1つ失敗しても全結果を確認したい。適切なのはどれですか?

答え: Promise.allSettled()

allSettledは各Promiseのfulfilledまたはrejected結果をすべて返します。全成功が必須ならPromise.allが適します。

Q7

検索入力が変わるたびに古いfetchを中止し、最新結果だけを表示したい。適切なのはどれですか?

答え: AbortControllerのsignalをfetchへ渡し、次回入力時にabortする

AbortSignalをfetchへ渡すと不要な通信と後続処理を中止できます。AbortErrorは通常の障害と区別し、表示更新には最新Request識別も併用できます。

Q8

fetchでHTTP 404を業務Errorとして扱いたい。適切な処理はどれですか?

答え: Response.okまたはstatusを確認し、期待しないStatusなら明示的にError処理する

fetchはNetwork Errorでは拒否されますが、404や500のResponseでは通常fulfilledになります。HTTP Statusを契約に沿って判定します。

Q9

Async Functionで一時ErrorをRetryする実装として適切なのはどれですか?

答え: 対象Errorと回数を限定し、BackoffとJitterを入れて最終失敗をthrowする

Retryは一時障害かつ安全な操作へ限定し、総時間と回数を制御します。失敗を握りつぶさず、呼出し側へ契約どおり伝えます。

Q10

大きなResponse Bodyを段階的に処理し、Memory使用量を抑えたい。適切なのはどれですか?

答え: ReadableStreamからChunkを読み、Backpressureを考慮して順次処理する

Stream処理は全DataをMemoryへ保持せず段階処理できます。Decoderの文字境界、Error、Cancellation、処理速度差も扱います。

Q11

Objectの入れ子を含む状態を完全に独立Copyしたい。Spread構文だけでは不十分な理由はどれですか?

答え: Spreadは浅いCopyで、入れ子Objectの参照を共有する

{...obj}は直下PropertyをCopyしますが、入れ子のArrayやObjectは同じ参照です。対応DataならstructuredCloneや目的別Copyを使います。

Q12

Date、Map、循環参照を含むClone可能なDataをDeep Copyしたい。適切なのはどれですか?

答え: structuredClone()を利用する

structuredCloneはStructured Clone Algorithmに対応する多くの組込み型と循環参照を扱います。Functionや一部Host Objectなど非対応値は確認が必要です。

Q13

Keyが任意のObjectであり、頻繁な追加・削除・反復が必要なCollectionに適するものはどれですか?

答え: Map

MapはObjectを含む任意型をKeyにでき、Size、反復順、追加・削除APIが明確です。文字列Key中心のRecordならObjectも適します。

Q14

DOM Elementに関連Dataを持たせたいが、Element破棄後はGC可能にしたい。適切なのはどれですか?

答え: WeakMapを使いElementをKeyにする

WeakMapのKeyは弱参照で、他に参照されないObjectのGCを妨げません。列挙できないため、全Entry一覧が必要な用途にはMapを使います。

Q15

大量のList ItemへClick処理を追加し、後から追加されるItemにも対応したい。適切なのはどれですか?

答え: 親要素へListenerを一つ置き、event.target.closest()で対象を判定する

Event DelegationはBubbleを利用し、親の一つのListenerで現在と将来の子要素を扱います。対象が親範囲内かも確認します。

Q16

利用者入力をTextとしてDOMへ表示し、HTMLとして解釈させたくない。適切なのはどれですか?

答え: textContentへ代入する

textContentは入力をMarkupとしてParseせずText Nodeとして扱います。Rich HTMLが必要なら信頼できるSanitizerとContext別対策が必要です。

Q17

外部入力のKeyをObjectへMergeする処理でPrototype Pollutionを防ぎたい。適切なのはどれですか?

答え: 許可KeyをSchemaで限定し、__proto__・constructor・prototypeなど危険Keyを拒否する

外部Keyを動的Pathへ使う場合はAllowlistとSchema Validationを行います。用途によってObject.create(null)やMapも防御層になります。

Q18

Component破棄後もWindowのEvent ListenerがComponentを参照し続ける。適切な対策はどれですか?

答え: 同じListener参照でremoveEventListenerするかAbortSignalでLife Cycleに合わせて解除する

長寿命TargetのListenerは短寿命Objectへの参照を保持し得ます。登録時に解除方法を設計し、TimerやObserverも同様にCleanupします。

Q19

ES Module間で循環依存が発生し、初期化前Binding参照Errorが起きた。適切な改善はどれですか?

答え: 共有Contractを依存方向が一方向になる別Moduleへ分離し、Top-level初期化の相互参照をなくす

ES ModuleのImportはLive Bindingですが、循環したTop-level評価では初期化順の問題が起こります。依存方向と初期化責務を整理します。

Q20

利用者入力のたびに検索APIを呼ぶ処理で、入力停止後に1回だけ実行したい。適切なのはどれですか?

答え: Debounceし、新しい入力ごとに以前のTimerを取消す

DebounceはEventが一定時間途切れた後に処理します。Scroll進捗など継続中も周期実行したい場合はThrottleが適します。

Q21

JSON.parseの結果をTypeScriptで安全に扱う入口の型として適切なのはどれですか?

答え: unknownとして受け、Schema ValidationやType Guardで絞り込む

TypeScriptの型はRuntime入力を検証しません。unknownは利用前のNarrowingを要求し、Validatorで構造を確認してからDomain型へ渡せます。

Q22

string | numberの値へ文字列Methodを呼ぶ前に必要な処理はどれですか?

答え: typeof value === 'string'でNarrowingする

typeof CheckはRuntime条件とControl Flow Analysisを一致させ、分岐内でstringへ型を絞ります。Assertionは誤った実値を防ぎません。

Q23

Loading・Success・Failureの状態と対応Dataを安全に表す型はどれですか?

答え: state Literalを持つDiscriminated Union

Discriminated Unionならstate === 'success'の分岐でData型が確定し、不可能な状態の組合せを表現しにくくできます。

Q24

Discriminated Unionへ新しいVariantを追加したとき、未対応switchをCompile Errorにしたい。適切なのはどれですか?

答え: default分岐で残った値をneverへ代入する

全Variant処理後の値はneverになります。新Variantが未処理ならneverへ代入できず、Exhaustiveness CheckとしてCompile Errorになります。

Q25

ID Propertyを持つ任意型からIDを取得するGeneric FunctionのConstraintとして適切なのはどれですか?

答え: T extends { id: string }

構造的Constraintで必要なidを保証しつつ、呼出し元の追加Propertyを含む具体型Tを保持できます。

Q26

Object型Tに存在するProperty名だけを引数へ許可したい。使う型演算子はどれですか?

答え: keyof T

keyofはObject型の既知Property KeyのUnionを作ります。K extends keyof TとT[K]を組み合わせると型安全なProperty取得を表現できます。

Q27

既存型Userの全PropertyをOptionalにした更新DTOを作りたい。適切なのはどれですか?

答え: Partial<User>

PartialはMapped Typeで各PropertyをOptionalにします。ただし業務上更新可能なFieldだけに限定するにはPickや専用DTOも検討します。

Q28

設定ObjectがRecord<string, string>を満たすか検査しつつ、各PropertyのLiteral推論を保ちたい。適切なのはどれですか?

答え: satisfies演算子

satisfiesは式が対象型へ代入可能か検査しながら、式自身のより具体的な推論型を維持できます。Runtime Validationではありません。

Q29

HTTP Method配列を変更不可のLiteral Tupleとして推論させたい。適切なのはどれですか?

答え: ['GET', 'POST'] as const

const AssertionはArrayをreadonly Tupleとして、要素を文字列Literalとして推論します。Runtimeで完全Freezeする機能ではありません。

Q30

strictNullChecksを有効にする主な効果はどれですか?

答え: nullとundefinedを独立した型として扱い、必要な場所で明示的な処理を要求する

strictNullChecksでは不在の可能性がUnionへ現れ、CheckやOptional Chainingなどを要求します。外部DataのRuntime Validationは別途必要です。

Q31

Record<string, User>から存在しないKeyを読む危険を型へ反映したい。適切なtsconfig Optionはどれですか?

答え: noUncheckedIndexedAccess

noUncheckedIndexedAccessは未宣言KeyのIndexed Accessへundefinedを加え、存在Checkを促します。Data構造を実行時に変更するOptionではありません。

Q32

Error Objectか不明な値をcatchした後、安全にmessageを取得したい。適切なのはどれですか?

答え: value instanceof Errorで確認し、それ以外はString(value)など別処理にする

JavaScriptではError以外もthrowできます。unknownとしてNarrowingすると、Errorのmessageへ安全にAccessし、その他の値も記録できます。

Q33

再利用するRuntime Check isUserの戻り値として、呼出し側をUserへNarrowingしたい。適切なのはどれですか?

答え: value is UserというType Predicate

Type Predicateを返すFunctionは、true分岐で引数を指定型へNarrowingします。Predicate実装は必要Propertyを実際に検証する必要があります。

Q34

validateConfigが失敗時にthrowし、成功後は引数をConfigとして扱わせたい。適切なSignatureはどれですか?

答え: asserts value is Config

Assertion Functionは正常Return後に条件が成立するとCompilerへ伝えます。実装が検証せずReturnすると型安全性を破壊します。

Q35

UserIdとOrderIdがどちらもstringだが、誤って渡すのを防ぎたい。適切な型設計はどれですか?

答え: 異なるBrandを交差させたBranded Typeを境界Factoryから作る

TypeScriptは構造的型付けなので単純Alias同士は区別されません。Brandを交差させ、検証済み生成関数から作ると混同を減らせます。

Q36

Libraryから型としてだけ使うImportを生成JavaScriptへ残したくない。適切なのはどれですか?

答え: import type { User } from './types'

import typeは型位置専用でEmit時に削除され、Runtime依存と型依存を明確に分けます。

Q37

型定義がない既存JavaScript Packageへ最小限の型を追加したい。適切なのはどれですか?

答え: 実際のPublic APIに合わせた.d.tsのdeclare moduleを用意する

Declaration FileはRuntime実装を記述せず、そのShapeをCompilerへ伝えます。実装Versionと同期し、可能ならPackage側または型Packageで管理します。

Q38

大規模Repositoryで複数TypeScript ProjectのBuildを分離し、依存順にIncremental Buildしたい。適切なのはどれですか?

答え: Project Referencesとcomposite Projectを使う

Project ReferencesはProject境界と依存を宣言し、tsc --buildで順序付きIncremental Buildを可能にします。Output Directoryも分離します。

Q39

Functionの引数がstringまたはstring[]で、戻り値は常にnumberである。設計として適切なのはどれですか?

答え: 引数をstring | string[]のUnionにし、Function内でNarrowingする

戻り値が入力Variantで変わらない単純な場合はUnionが明確です。Overloadは入力によって戻り値関係が異なるなど、呼出しSignatureを分ける価値がある場合に使います。

Q40

TypeScriptで型Checkが通ったAPI ResponseでもRuntime Validationが必要な理由はどれですか?

答え: 型AnnotationはCompile時に消え、外部Responseの実際のShapeを強制しないため

TypeScriptはJavaScriptへ変換される際に型が消えます。Network、Storage、利用者入力などTrust BoundaryではSchemaを検証し、成功後に型付きDataへ変換します。

certdrill.dev は、LPI Japan・IPA・AWS・Microsoft Azure その他各試験団体と一切関係のない独立した非公式学習サイトです。問題・解説はオリジナルコンテンツです。