roblox-luau-types
Use for Luau annotations, generics, unions, narrowing, strictness, sealed tables, module type exports, or typed metatables.
By tabooharmony · 610 installs
npx skills add tabooharmony/roblox-brain --skill roblox-luau-types
Source repository · Upstream listing
Luau Type System
When to Load
Load for Luau type system work: annotations, generics, union types, type narrowing, sealed/unsealed tables, strictness modes ( !strict vs !nonstrict ), module type exports, and metatable backed object typing. For syntax questions, use roblox luau core . For OOP/async/modules, use roblox luau patterns .
Quick Reference
Strictness: Use !strict for maintained code, !nonstrict while transitioning, and !nocheck only for legacy/generated code. Project settings and directives select the mode; do not assume one global default.
Inference philosophy: Infer first, annotate boundaries (params, returns, exports). Don't annotate every local. Noise hides signal.
Sealed vs unsealed tables:
Build tables fully before annotating. Passing/returning seals them.
Unions & tagged unions:
Narrowing:
Generics: Use when input→output type matters. function first<T (list: {T}): T? . Generic aliases: type Result<T = {success: boolean, value: T?} . Never replace with any .
Type exports: export type Foo = {...} at module boundary. Consumers use require + Types.Foo .
Object typing: export type Counter = typeof(setmetatable({} :: CounterData, Counter)) for precise self.
Casts (::): Precision tool to narrow overly generic inference, never to hide errors.
Write types you can trust: annotations are contracts for the compiler, not proof of runtime validity. Trust boundaries (remotes, DataStores, HttpService, attributes) still get runtime checks even when everything is annotated; inside a trusted boundary, let types carry the load instead of re checking every call.
Key mistakes: Unsealed any propagation in nonstrict, sealing tables too early, unions without discriminants, annotating every local.
Full reference: see references/full.md