Typescript Best Practices

作者 cursorccb5507cec15無授權條款10K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫今天更新

TypeScript best practices. Use when reading or editing any .ts or .tsx file.

AI 產生的概覽

TypeScript 編碼規範,涵蓋型別建模、型別收窄、驗證與測試紀律。

功能
這個技能提供一份 TypeScript 最佳實務規則表,用於閱讀或編輯 .ts 與 .tsx 檔案。內容涵蓋可辨識聯合、品牌型別、建構式建模、以 unknown 取代 any、結構描述優先驗證、收窄優先順序、窮盡性檢查、以 satisfies 取代 as、邊界解析、由結構描述推導型別、物件參數、真實測試與結構化遙測。它指向一份範例參考檔案,並引用獨立的 principle 技能來處理型別系統與邊界紀律。
適用情境
在閱讀或編輯任何 TypeScript 或 TypeScript React 檔案時使用,讓型別建模與驗證遵循一致慣例。適用於涉及型別、型別斷言、型別守衛或邊界解析的程式碼工作。
執行需求
沒有指令碼,只有說明內容。它假定儲存庫中已有執行時期的結構描述驗證函式庫可用於結構描述優先驗證,並引用獨立的 principle 技能。

TypeScript best practices

Apply the type-system-discipline principle skill first.

RuleSummary
Discriminated unionsModel variants with a kind literal discriminant so impossible states can't be represented. No optional-field bags.
Branded typesBrand primitives with & { readonly __brand: "X" } so they can't be mixed up. Validate once at the boundary.
Constructive modelingBuild the shape so the illegal value can't be constructed. [T, ...T[]] for non-empty, [T, T][] for even length, start plus duration for a range. Not a runtime guard, not a wish for refinement types.
Simplest total typeKeep T[] while every operation on it stays total. Strengthen to NonEmpty<T> only where the loose type forces !, a cast, or a "should never happen" throw.
unknown over anyExternal data is unknown.
Schemas before guardsBefore hand-writing a property-by-property type guard, use the repository's runtime schema library and infer the type from the schema, such as z.infer.
No as castsEvery as is a runtime crash waiting. Cast only after validation.
Narrowing hierarchyDiscriminant switch > in operator > typeof/instanceof > user-defined type guard > as.
Type guardsMust verify the claim. A lying guard is worse than as because the bug hides behind a name that says it's safe. Name them isX or hasX.
ExhaustivenessInline const _exhaustive: never = x; in default arms so the compiler errors when a new variant is added.
satisfies over asValidates the value without widening literal types.
Boundary validationParse where data crosses in, into a named domain type. Record<string, unknown> (however spelled) stops at that parse. Trust types inside. See the boundary-discipline principle skill.
Schema-derived typesReach for Pick/Omit/Parameters/ReturnType/Awaited/typeof before declaring a new interface.
Object argsPass objects, not positional, so argument order is self-documenting. Skip on hot paths (per-frame render, tokenizers, parsers).
Real testsDon't mock what you can run. Prefer the framework's real test primitives with leak/disposable checks, and verify UI in a running build. Mock only what you can't run locally.
Structured telemetryPrefer structured logger diagnostics with enough context to debug from an id. No console.log in shipped code.

Examples: references/patterns.md.

來源與署名

來源:cursor/plugins位於pstack/skills/typescript-best-practices提交ccb5507

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架