Loading...
Loading...
Use for Luau type-system work focused on strictness modes, annotations, inference-aware API design, generics, refinements, advanced type patterns, and Roblox-aware type usage at the type level.
npx skill4agent add stackfox-labs/luau-skills luau-types--!strict--!nonstrictanyIsA--!strictanyluau-coreluau-performanceroblox/*--!strict--!nonstrict--!nocheckselfany{T}T?T | nil::anysetmetatableselfInstancePartEnum.MaterialIsAreferences/type-system-overview.mdreferences/basic-types-and-table-typing.mdanyunknownreferences/generics.mdreferences/unions-and-intersections.mdreferences/refinements.mdtype(...)assertreferences/object-oriented-typing.mdselfreferences/type-functions.mdreferences/roblox-types-in-luau.mdIsAanyself--!nonstrictanyany:self::string & number--!strict
export type User = {
id: number,
name: string,
nickname: string?,
}
local M = {}
function M.makeUser(id: number, name: string): User
return {
id = id,
name = name,
nickname = nil,
}
end
return M--!strict
local function first<T>(items: {T}): T?
return items[1]
end
local a = first({1, 2, 3}) -- number?
local b = first({"x", "y"}) -- string?--!strict
type Loading = { kind: "loading" }
type Ready<T> = { kind: "ready", value: T }
type Failed = { kind: "failed", message: string }
type State<T> = Loading | Ready<T> | Failed
local function readValue(state: State<number>): number?
if state.kind == "ready" then
return state.value
end
return nil
endself--!strict
local Counter = {}
Counter.__index = Counter
type CounterData = {
value: number,
}
export type Counter = typeof(setmetatable({} :: CounterData, Counter))
function Counter.new(initialValue: number): Counter
return setmetatable({
value = initialValue,
}, Counter)
end
function Counter.increment(self: Counter, amount: number): number
self.value += amount
return self.value
end
return Counter