prefer-type-fest-required-deep
Require TypeFest RequiredDeep over DeepRequired aliases.
Targeted pattern scopeโ
This rule reports DeepRequired<T> aliases and prefers RequiredDeep<T> for recursively required object shapes.
What this rule reportsโ
- Type references named
DeepRequired.
Detection boundariesโ
- โ
Reports direct
DeepRequired<T>references. - โ Does not auto-fix where legacy aliases treat nullable leaves differently.
Why this rule existsโ
RequiredDeep<T> is the canonical TypeFest utility for recursively requiring nested properties.
Using one utility name clarifies strict configuration and post-validation object contracts.
โ Incorrectโ
type StrictConfig = DeepRequired<AppConfig>;
โ Correctโ
import type { RequiredDeep } from "type-fest";
type StrictConfig = RequiredDeep<AppConfig>;
Behavior and migration notesโ
RequiredDeep<T>recursively removes optional modifiers from nested properties.- Re-check generated API types if optionality was previously preserved in certain branches.
- Combine with validation/parsing phases before exposing strict internal types.
ESLint flat config exampleโ
import typefest from "eslint-plugin-typefest";
export default [
{
plugins: { typefest },
rules: {
"typefest/prefer-type-fest-required-deep": "error",
},
},
];
When not to use itโ
Disable this rule if your codebase intentionally standardizes DeepRequired naming instead of TypeFest.
Package documentationโ
TypeFest package documentation:
Source file: source/required-deep.d.ts
/**
* Create a type from another type with all keys and nested keys set to
* required.
*
* Use-cases:
*
* - Creating optional configuration interfaces where the underlying
* implementation still requires all options to be fully specified.
* - Modeling the resulting type after a deep merge with a set of defaults.
*
* @category Utilities
* @category Object
* @category Array
* @category Set
* @category Map
*
* @example
* ```
* import type {RequiredDeep} from 'type-fest';
*
* type Settings = {
* textEditor?: {
* fontSize?: number;
* fontColor?: string;
* fontWeight?: number | undefined;
* };
* autocomplete?: boolean;
* autosave?: boolean | undefined;
* };
*
* type RequiredSettings = RequiredDeep<Settings>;
* //=> {
* // textEditor: {
* // fontSize: number;
* // fontColor: string;
* // fontWeight: number | undefined;
* // };
* // autocomplete: boolean;
* // autosave: boolean | undefined;
* // }
* ```
*
* Note that types containing overloaded functions are not made deeply required due to a [TypeScript limitation](https://github.com/microsoft/TypeScript/issues/29732).
*/
Rule catalog ID: R060