is-kit

struct

Shape guard for objects; supports exact key checking and key-level optional fields via optionalKey(...).

import {
arrayOf,
optional,
optionalKey,
struct,
isString,
isNumber,
} from 'is-kit';
const isUser = struct({
id: isNumber,
name: isString,
nickname: optionalKey(isString),
displayName: optionalKey(optional(isString)),
});
// isUser: Guard<{
// id: number;
// name: string;
// nickname?: string;
// displayName?: string | undefined;
// }>
const input: unknown = {
id: 42,
name: 'Neko',
nickname: 'nya',
};
if (isUser(input)) {
input.nickname?.toUpperCase(); // input narrowed to User shape
}
const isExactUser = struct(
{ id: isNumber, name: isString },
{ exact: true }
);
isExactUser({ id: 1, name: 'A' }); // true
isExactUser({ id: 1, name: 'A', extra: 1 }); // false (extra keys rejected)
const isTeam = struct({
name: isString,
members: arrayOf(isUser),
});
// Nested structs compose cleanly; members inherits the User guard.
isTeam({
name: 'core',
members: [{ id: 1, name: 'Neko' }],
}); // true
isTeam({
name: 'core',
members: [{ id: 1, name: 'Neko', nickname: 123 }],
}); // false (nickname is not a string)
// Use optionalKey(...) when the property may be omitted.
// Use optional(...) when the property exists but its value may be undefined.