Rule coverage gap analysis
This page tracks the remaining public type-fest and ts-extras APIs that are not
directly covered by eslint-plugin-typefest rules.
Source snapshot:
type-festmainAPI indextype-festREADME API catalogts-extrasmainAPI indexts-extrasREADME API catalog
Current verdictโ
ts-extras does not have an uncovered public export right now. The current
upstream source/index.ts exports 33 runtime helpers, and this plugin has a
matching prefer-ts-extras-* rule for each helper. The plugin also has two
extra filter-context rules for isDefined and isPresent, so the ts-extras
surface is actually covered more deeply than a one-rule-per-export audit would
require.
The remaining gaps are almost entirely type-fest types. That is expected:
type-fest exports type-level building blocks whose manual equivalents are not
syntactically stable enough for a safe ESLint rule.
The additional-rule pass is now closed for broad/default rule additions. The rules implemented from this report cover the high-confidence patterns with stable syntax and safe autofixes. Remaining candidates should stay documented as non-goals or future-only ideas unless real project code proves a narrow, low-noise rule would be correct.
Implemented from this gap listโ
The following high-confidence type-guard rules have been added since the first coverage snapshot:
prefer-type-fest-is-anyprefer-type-fest-is-neverprefer-type-fest-is-nullprefer-type-fest-is-undefinedprefer-type-fest-is-unknownprefer-type-fest-is-tupleprefer-type-fest-andprefer-type-fest-orprefer-type-fest-extract-rest-elementprefer-type-fest-is-nullableprefer-type-fest-has-optional-keysprefer-type-fest-has-required-keysprefer-type-fest-has-readonly-keysprefer-type-fest-has-writable-keysprefer-type-fest-optional-keys-ofprefer-type-fest-required-keys-ofprefer-type-fest-readonly-keys-ofprefer-type-fest-writable-keys-ofprefer-type-fest-entryprefer-type-fest-entriesprefer-type-fest-array-elementprefer-type-fest-array-values
TypeFest APIs not covered by a direct ruleโ
The following type-fest exports currently have no direct rule that prefers
them from an equivalent local type expression. Legacy aliases such as Opaque,
UnwrapOpaque, and deprecated If* utilities are intentionally omitted from
this list because existing rules already cover their migration paths.
Verdict legend:
- Consider: There may be a useful rule, but it should be narrow, suggestion-only, opt-in, or based on explicitly named local helper aliases. These are not approved for default autofix rules from this gap pass.
- Do not implement: A general rule would be too noisy, too project-specific, or too likely to change semantics.
Basicโ
Classโ Consider: Only report exact structural class types that include bothprototype: Pick<T, keyof T>and a matching construct signature.AbstractClassโ Consider: Same asClass, but only for exact abstract construct signatures plus the prototype member.TypedArrayโ Do not implement: Manual typed-array unions are rare and vary by project; broad reporting would be name-based.ObservableLikeโ Do not implement: Structuralsubscribecontracts vary too much across observable libraries.LowercaseLetterโ Do not implement: Manual character unions are not a stable or common enough lint target.UppercaseLetterโ Do not implement: Same reason asLowercaseLetter.DigitCharacterโ Do not implement: Same reason asLowercaseLetter.Alphanumericโ Do not implement: Same reason asLowercaseLetter.
Object and utility typesโ
EmptyObjectโ Do not implement: TypeFest's current implementation uses an internal unique-symbol brand, and its source explicitly notes thatRecord<string, never>,Record<keyof any, never>, and related record forms do not work asEmptyObject.NonEmptyObjectโ Do not implement: Non-empty object intent is usually a semantic constraint, not a stable local type expression.ObjectMergeโ Do not implement: This is an internal-style composition primitive behindMerge; manual equivalents are not stable.MergeDeepโ Do not implement: Deep recursive merge helpers are too varied and expensive to recognize safely.OverridePropertiesโ Consider: Only useful for exact local helper aliases that intentionally constrain overrides to existing keys.SingleKeyObjectโ Consider: Could target exact mapped-union helpers, but it is likely low frequency.PickDeepโ Do not implement: Deep path utilities are project-specific and recursive.OmitDeepโ Do not implement: Same reason asPickDeep.PartialOnUndefinedDeepโ Do not implement: Deep undefined-aware transforms are too semantic for a general syntax rule.UndefinedOnPartialDeepโ Do not implement: Same reason asPartialOnUndefinedDeep.UnwrapPartialโ Do not implement: Manual versions usually appear inside larger recursive helpers, not as isolated reportable aliases.InvariantOfโ Do not implement: Invariance helpers rely on branding tricks that are too easy to get subtly wrong.SetRequiredDeepโ Do not implement: Deep mapped transforms are already in the risky category.SetNonNullableDeepโ Do not implement: Same reason asSetRequiredDeep.LiteralToPrimitiveโ Consider: Only report exact canonical conditional aliases; do not guess from arbitrary literal-widening helpers.LiteralToPrimitiveDeepโ Do not implement: The deep version becomes a recursive transform and is too broad.SetParameterTypeโ Consider: Could replace exact local helper aliases that rebuild a function signature with new parameters.SimplifyDeepโ Do not implement: AddingSimplifyDeepis an intent and display-quality choice, not an equivalent syntax rewrite.Getโ Do not implement: Path lookup helpers vary heavily and often carry different fallback semantics.KeyAsStringโ Consider: Exact key-to-string helper aliases may be reportable, but only with narrow conditional/template-literal matching.Exactโ Consider: Suggestion-only for exact excess-property helper aliases; avoid autofix because semantics vary.OptionalKeysOfโ Implemented:prefer-type-fest-optional-keys-ofreports the exact distributive mapped-key composition based onIsOptionalKeyOf<T, Key>.HasOptionalKeysโ Implemented:prefer-type-fest-has-optional-keysreports exactOptionalKeysOf<T> extends never ? false : truecompositions imported fromtype-fest.RequiredKeysOfโ Implemented:prefer-type-fest-required-keys-ofreports the exact distributiveExclude<keyof T, OptionalKeysOf<T>>composition.HasRequiredKeysโ Implemented:prefer-type-fest-has-required-keysreports exactRequiredKeysOf<T> extends never ? false : truecompositions imported fromtype-fest.ReadonlyKeysOfโ Implemented:prefer-type-fest-readonly-keys-ofreports the exact distributive mapped-key composition based onIsReadonlyKeyOf<T, Key>.HasReadonlyKeysโ Implemented:prefer-type-fest-has-readonly-keysreports exactReadonlyKeysOf<T> extends never ? false : truecompositions imported fromtype-fest.WritableKeysOfโ Implemented:prefer-type-fest-writable-keys-ofreports the exact distributiveExclude<keyof T, ReadonlyKeysOf<T>>composition.HasWritableKeysโ Implemented:prefer-type-fest-has-writable-keysreports exactWritableKeysOf<T> extends never ? false : truecompositions imported fromtype-fest.Spreadโ Do not implement: Spread semantics are intentionally subtle and not equivalent to ordinary intersections or merges.IsEqualโ Do not implement: Exact mutual-assignability boolean helpers look stable at first, but common implementations differ in distribution,any,never, and function-parameter edge cases. A broad rule would be easy to make noisy or subtly wrong.TaggedUnionโ Consider: Good suggestion-only rule for unions of object literals with a shared literal discriminant.IntRangeโ Do not implement: Numeric range builders are recursive and do not have a safe general syntax equivalent.IntClosedRangeโ Do not implement: Same reason asIntRange.ArrayIndicesโ Consider: Possible for exact tuple-key exclusion helpers, but fixers can change string index keys to numeric keys.ArraySpliceโ Do not implement: Tuple splice helpers are complex recursive tuple programs.ArrayTailโ Consider: TypeFest preserves readonly arrays, normal arrays, empty tuples, leading rest elements, andany/neverbehavior. SimpleT extends [unknown, ...infer Tail] ? Tail : neverhelpers are not equivalent.SetFieldTypeโ Consider: Only report exactOmit<T, K> & Record<K, V>style helper aliases when key constraints match.Pathsโ Do not implement: Path enumeration is a deep recursive transform.SharedUnionFieldsโ Consider: Potentially suggestion-only for exact local helper aliases, but broad structural detection is risky.SharedUnionFieldsDeepโ Do not implement: Deep union-field transforms are too complex.AllUnionFieldsโ Consider: Same risk profile asSharedUnionFields.Andโ Implemented:prefer-type-fest-andreportsAndAll<[A, B]>andAndAll<readonly [A, B]>imported fromtype-fest, then rewrites them toAnd<A, B>.Orโ Implemented:prefer-type-fest-orreportsOrAll<[A, B]>andOrAll<readonly [A, B]>imported fromtype-fest, then rewrites them toOr<A, B>.Xorโ Consider: TypeFest's booleanXordistributesbooleanand treatsneverasfalse. Only exact boolean-helper compositions should be considered; object XOR helpers must stay out of scope.AllExtendโ Consider: Useful only for exact local aliases that encode the same tuple-wide extends semantics.SomeExtendโ Consider: Same constraints asAllExtend.FindGlobalTypeโ Do not implement: This is environment-introspection intent, not a replaceable local type expression.FindGlobalInstanceTypeโ Do not implement: Same reason asFindGlobalType.ConditionalSimplifyโ Do not implement: Simplification choices are display-oriented and too intent-heavy.ConditionalSimplifyDeepโ Do not implement: Same reason asConditionalSimplify, with added deep-recursion risk.ExclusifyUnionโ Consider: Suggestion-only for exactnever-padding union helpers; no broad autofix.
Type guardsโ
IsLiteralโ Consider: Only if it composes exact string, numeric, boolean, and symbol literal guard shapes.IsStringLiteralโ Consider: TypeFest handlesany,never, tagged types, and infinite string patterns, so only exact aliases that preserve those fallbacks are safe.IsNumericLiteralโ Consider: TypeFest distributes across numeric primitive literal families and handlesnever, so simpleT extends number ? number extends Taliases are not equivalent.IsBooleanLiteralโ Consider: Same caveat asIsNumericLiteral; simple boolean conditionals produce different results fornever.IsSymbolLiteralโ Consider: Same caveat asIsNumericLiteral.IsEmptyObjectโ Do not implement: It depends on TypeFest's brandedEmptyObject; commonT extends {}orkeyof T extends neverchecks are not equivalent.IsUnionโ Consider: TypeFest preservesnever, exact equality, and boolean fallback behavior. Simple distributive-union helpers are not equivalent, so only exact aliases matching the current TypeFest algorithm should be considered.IsLowercaseโ Consider: TypeFest handles string pieces and returnsbooleanfor uncertain cases, so only exact aliases with equivalent fallback behavior are safe.IsUppercaseโ Consider: Same constraints asIsLowercase.IsOptionalโ Consider: Only report exactundefined extends Tstyle helpers after checking equivalence withtype-festsemantics.IsNullableโ Implemented:prefer-type-fest-is-nullablereports exact any-safe nullable guard conditionals that preserve TypeFest'sanyhandling.IsOptionalKeyOfโ Do not implement: The direct guard semantics include TypeFest-specificany, distribution, and key-modifier behavior. The safe coverage line is the implementedOptionalKeysOfandHasOptionalKeysrules.IsRequiredKeyOfโ Do not implement: Same reason asIsOptionalKeyOf. The implementedRequiredKeysOfandHasRequiredKeysrules cover stable higher-level compositions instead.IsReadonlyKeyOfโ Do not implement: Same reason asIsOptionalKeyOf. The implementedReadonlyKeysOfandHasReadonlyKeysrules cover stable higher-level compositions instead.IsWritableKeyOfโ Do not implement: Same reason asIsOptionalKeyOf. The implementedWritableKeysOfandHasWritableKeysrules cover stable higher-level compositions instead.
JSON and structured cloneโ
Jsonifyโ Do not implement: Manual JSON conversion types vary by project and often encode different treatment for methods, dates, maps, and undefined.Jsonifiableโ Do not implement: Same reason asJsonify.StructuredCloneableโ Do not implement: Cloneability aliases are semantic domain contracts, not stable syntax.
String typesโ
Trimโ Do not implement: Template-literal parser helpers vary too much.Splitโ Do not implement: Same reason asTrim.Wordsโ Do not implement: Same reason asTrim.Replaceโ Do not implement: Same reason asTrim.StringSliceโ Do not implement: String slicing helpers are recursive and option-sensitive.StringRepeatโ Do not implement: Recursive string builders are not a stable lint target.RemovePrefixโ Consider: Exact${Prefix}${infer Rest}aliases may be reportable, but only with no custom fallback semantics.
Array and tuple typesโ
Includesโ Consider: ExactElement extends Tuple[number]helpers may be reportable, but false positives are easy when distributivity matters.Joinโ Do not implement: Tuple/string join helpers are recursive template-literal parsers.ArraySliceโ Do not implement: Recursive tuple slicing is too complex.LastArrayElementโ Consider: TypeFest handles arrays, empty tuples, and trailing spread elements. SimpleT extends [...unknown[], infer Last]helpers should not be autofixed unless their narrower semantics are explicit.FixedLengthArrayโ Do not implement: Recursive tuple builders are not stable enough.MultidimensionalArrayโ Do not implement: This is intent-level type modeling rather than a common manual pattern.MultidimensionalReadonlyArrayโ Do not implement: Same reason asMultidimensionalArray.ReadonlyTupleโ Consider: Only report exact mutable-tuple-to-readonly helper aliases; avoid broad readonly tuple syntax.TupleToUnionโ Do not implement:T[number]is already owned byprefer-type-fest-array-element, and adding a second rule would duplicate reports.TupleToObjectโ Consider: Exact tuple-to-object mapped aliases may be reportable, but likely low priority.SplitOnRestElementโ Consider: Exact variadic rest split aliases may be reportable without autofix.ExtractRestElementโ Implemented:prefer-type-fest-extract-rest-elementreports exactSplitOnRestElement<T>[1][number]usage imported fromtype-festand rewrites it toExtractRestElement<T>.ExcludeRestElementโ Consider: TypeFest composesSplitOnRestElementwith readonly andany/neverpreservation. Manual tuple-spread removal helpers are only safe if matched as an exact helper composition.ArrayReverseโ Do not implement: Recursive tuple reversal is too broad.
Numeric typesโ
PositiveInfinityโ Do not implement: No safe normal-code equivalent.NegativeInfinityโ Do not implement: No safe normal-code equivalent.Finiteโ Do not implement: Numeric branding/range aliases are semantic and project-specific.Integerโ Do not implement: Same reason asFinite.Floatโ Do not implement: Same reason asFinite.NegativeFloatโ Do not implement: Same reason asFinite.Negativeโ Do not implement: Same reason asFinite.NonNegativeโ Do not implement: Same reason asFinite.NegativeIntegerโ Do not implement: Same reason asFinite.NonNegativeIntegerโ Do not implement: Same reason asFinite.IsNegativeโ Do not implement: Numeric sign checks are implemented with varied string/numeric helper stacks.IsFloatโ Do not implement: Same reason asIsNegative.IsIntegerโ Do not implement: Same reason asIsNegative.GreaterThanโ Consider: Only report aliases that reverse existingLessThanusage; do not detect manual numeric algorithms.GreaterThanOrEqualโ Consider: Same rule shape asGreaterThan, usingLessThanOrEqual.Sumโ Do not implement: Type-level arithmetic helpers are recursive and project-specific.Subtractโ Do not implement: Same reason asSum.
Change-case typesโ
CamelCaseโ Do not implement: Manual case parsers are not stable syntax.CamelCasedPropertiesโ Do not implement: Property-case transforms add mapped-type and option semantics.CamelCasedPropertiesDeepโ Do not implement: Deep property transforms are too complex.KebabCaseโ Do not implement: Same reason asCamelCase.KebabCasedPropertiesโ Do not implement: Same reason asCamelCasedProperties.KebabCasedPropertiesDeepโ Do not implement: Same reason asCamelCasedPropertiesDeep.PascalCaseโ Do not implement: Same reason asCamelCase.PascalCasedPropertiesโ Do not implement: Same reason asCamelCasedProperties.PascalCasedPropertiesDeepโ Do not implement: Same reason asCamelCasedPropertiesDeep.SnakeCaseโ Do not implement: Same reason asCamelCase.SnakeCasedPropertiesโ Do not implement: Same reason asCamelCasedProperties.SnakeCasedPropertiesDeepโ Do not implement: Same reason asCamelCasedPropertiesDeep.ScreamingSnakeCaseโ Do not implement: Same reason asCamelCase.DelimiterCaseโ Do not implement: Same reason asCamelCase.DelimiterCasedPropertiesโ Do not implement: Same reason asCamelCasedProperties.DelimiterCasedPropertiesDeepโ Do not implement: Same reason asCamelCasedPropertiesDeep.
Miscellaneous and strict built-insโ
GlobalThisโ Do not implement: Replacingtypeof globalThiswould be an opinionated style change rather than a semantic improvement.PackageJsonโ Consider: Only report local aliases named exactlyPackageJsonor equivalent project-specific migration patterns.TsConfigJsonโ Consider: Same constraints asPackageJson.ExtendsStrictโ Consider: Opt-in only; document the stricter semantics and avoid replacing ordinary conditional types.ExtractStrictโ Consider: Opt-in only; replace explicitly named local strict helpers, not normalExtract.ExcludeStrictโ Consider: Opt-in only; replace explicitly named local strict helpers, not normalExclude.ExcludeExactlyโ Consider: Opt-in only; replace explicitly named local strict helpers where exact exclusion semantics are clear.
Closed candidates and future-only ideasโ
No remaining candidate from this report should be built as a default autofix rule right now. The implemented rules below are the completed high-confidence set. The unimplemented entries in this section are retained only as future research notes for opt-in, suggestion-only, or explicitly named local-helper migrations.
Implemented: prefer-type-fest-array-elementโ
This rule now detects T[number] when T resolves to an array or tuple type,
and prefers ArrayElement<T>.
The implemented scope is intentionally type-aware:
- Reports
T[number]only when the TypeScript checker resolvesTto an array-like type. - Leaves
typeof tuple[number]alone for a futureArrayValuesrule. - Ignores number-indexed object maps where
ArrayElement<T>would not be equivalent. - Does not yet rewrite conditional
inferhelper aliases. Those should start as suggestions if added later.
Implemented: prefer-type-fest-array-valuesโ
This rule now detects typeof values[number] when values resolves to an array
or tuple type, and prefers ArrayValues<typeof values>.
The implemented scope is intentionally type-aware:
- Reports only
typeof values[number]where the TypeScript checker resolvesvaluesto an array-like type. - Leaves plain
T[number]toprefer-type-fest-array-element. - Ignores number-indexed object maps where
ArrayValues<typeof values>would not be equivalent.
Deferred: prefer-type-fest-array-indicesโ
Detect manual index unions derived from tuple keys, such as
Exclude<keyof typeof tuple, keyof unknown[]>, when the operand is a constant
tuple and prefer ArrayIndices<typeof tuple>.
This should stay deferred. The manual forms vary, and incorrect autofixes could change string index keys into numeric index keys.
Implemented: prefer-type-fest-entry and prefer-type-fest-entriesโ
These rules now cover exact object-entry pair aliases:
type ObjectEntry<T> = [keyof T, T[keyof T]];
type ObjectEntries<T> = Array<[keyof T, T[keyof T]]>;
The implemented scope is intentionally narrow:
prefer-type-fest-entryreports[keyof T, T[keyof T]].prefer-type-fest-entriesreportsArray<[keyof T, T[keyof T]]>and[keyof T, T[keyof T]][].ReadonlyArray<[keyof T, T[keyof T]]>is left alone until readonly collection semantics are modeled explicitly.prefer-type-fest-value-ofnow defers inside exact entry tuple patterns so a single manual entry tuple does not produce duplicateEntryandValueOfreports.
Deferred: prefer-type-fest-tagged-unionโ
Detect type aliases that are explicit unions of object type literals sharing the same discriminant property:
type Event =
| {type: "start"; at: Date}
| {type: "stop"; reason: string};
Prefer TaggedUnion<"type", ...> when every union member has the same literal
discriminant key and every discriminant value is unique.
This should not be added from the current gap pass. If real-world usage justifies it later, it should start without autofix because preserving comments, property ordering, and multi-line formatting would make a fix fragile.
prefer-type-fest-type-guardsโ
The safe family of type-guard rules from this pass has already been added:
- Implemented:
prefer-type-fest-is-unknown - Implemented:
prefer-type-fest-is-tuple - Implemented:
prefer-type-fest-is-nullable
Only exact canonical conditional-type shapes should be reported. The initial
implemented rules follow that line: IsNever<T>, IsNull<T>, and
IsUndefined<T> match tuple-wrapped conditionals, while IsAny<T> matches the
canonical 0 extends 1 & T form. IsNullable<T> now only reports the exact
any-safe nullable helper shape; it intentionally ignores shorter
Extract<T, null> checks because they do not preserve any behavior. Future
guard rules should not be added without real-world examples and exact semantic
proof that any, never, distribution, and modifier behavior are preserved.
Implemented: prefer-type-fest-and and prefer-type-fest-orโ
These rules now cover the exact two-value forms of the existing all-value boolean helpers:
type Both<A extends boolean, B extends boolean> = AndAll<[A, B]>;
type Either<A extends boolean, B extends boolean> = OrAll<[A, B]>;
The implemented scope is intentionally narrow:
- Reports direct and namespace-qualified
AndAll/OrAllreferences imported fromtype-fest. - Only rewrites two-element tuple arguments, including
readonly [A, B]. - Leaves three-or-more-element tuple checks on
AndAll/OrAll. - Skips named, optional, and rest tuple elements because those cannot be safely converted into ordinary generic arguments.
Do not implement: prefer-type-fest-empty-objectโ
Detect exact empty-object intent, not every {}.
Originally suggested reportable shapes:
Record<PropertyKey, never>Record<string | number | symbol, never>- local aliases named
EmptyObjectthat expand to the same structure
Bad reportable shape:
- bare
{}in arbitrary type positions
This should stay out of scope. Bare {} in TypeScript often means "any
non-nullish value", and TypeFest's own docs say the Record<..., never> forms do
not work as EmptyObject.
Implemented: prefer-type-fest-extract-rest-elementโ
This rule now covers the exact TypeFest helper composition:
type Rest<T extends UnknownArray> = SplitOnRestElement<T>[1][number];
The implemented scope is intentionally narrow:
- Reports direct and namespace-qualified
SplitOnRestElementreferences imported fromtype-fest. - Only rewrites the exact
[1][number]rest-element extraction. - Leaves the raw split tuple segments alone.
Implemented: prefer-type-fest-is-nullableโ
This rule now covers exact nullable checks that preserve TypeFest's any
behavior:
type Result<T> = IsAny<T> extends true ? true : Extract<T, null> extends never ? false : true;
type Result<T> = 0 extends 1 & T ? true : Extract<T, null> extends never ? false : true;
The implemented scope is intentionally narrow:
- Reports direct, aliased, and namespace-qualified
IsAnyreferences imported fromtype-fest. - Reports the canonical manual
0 extends 1 & Tany branch. - Only rewrites when the inner branch is exactly
Extract<T, null> extends never ? false : truefor the sameT. - Leaves the shorter
Extract<T, null>nullable guard alone because it changes behavior forany.
Implemented: prefer-type-fest-has-*keysโ
These rules now cover exact TypeFest key-existence helper compositions:
type HasOptionals<T extends object> = OptionalKeysOf<T> extends never ? false : true;
type HasRequired<T extends object> = RequiredKeysOf<T> extends never ? false : true;
type HasReadonly<T extends object> = ReadonlyKeysOf<T> extends never ? false : true;
type HasWritable<T extends object> = WritableKeysOf<T> extends never ? false : true;
The implemented scope is intentionally narrow:
- Reports direct, aliased, and namespace-qualified
*KeysOfreferences imported fromtype-fest. - Only rewrites the exact
extends never ? false : trueshape. - Leaves inverted checks and custom fallback branches alone.
- Leaves local
*KeysOfhelpers alone.
Implemented: prefer-type-fest-*keys-ofโ
These rules now cover exact TypeFest key-extraction helper compositions:
type Optional<Type extends object> = Type extends unknown
? (keyof {[Key in keyof Type as IsOptionalKeyOf<Type, Key> extends false ? never : Key]: never}) &
keyof Type
: never;
type Required<Type extends object> = Type extends unknown
? Exclude<keyof Type, OptionalKeysOf<Type>>
: never;
The implemented scope is intentionally narrow:
prefer-type-fest-optional-keys-ofandprefer-type-fest-readonly-keys-ofreport only the exact distributive mapped-key shape based on TypeFestIsOptionalKeyOf/IsReadonlyKeyOf.prefer-type-fest-required-keys-ofandprefer-type-fest-writable-keys-ofreport only the exact distributiveExclude<keyof T, *KeysOf<T>>shape.- Direct, aliased, and namespace-qualified TypeFest helper imports are supported.
- Non-distributive helpers, local helper types, custom key filters, and reversed exclusions are ignored.
Deferred: prefer-type-fest-exactโ
Detect local generic aliases that implement exact object checking by adding
never properties for excess keys.
This should stay deferred. Different "exact" helper types encode assignability
constraints that are not equivalent to Exact; a future rule would need to be
conservative and suggestion-only.
Deferred: prefer-type-fest-strict-builtinsโ
Cover ExtendsStrict, ExtractStrict, ExcludeStrict, and ExcludeExactly,
but do not blindly replace built-in extends, Extract, or Exclude.
These types intentionally have stricter semantics than the built-ins. A future rule here would need to be opt-in, document the semantic change, and avoid autofix unless it is replacing an explicitly named local strict helper.
Low-value or risky candidatesโ
These APIs should stay out of the plugin unless there is a specific repeated pattern in real projects.
Deep object transformsโ
MergeDeep, PickDeep, OmitDeep, SetRequiredDeep,
SetNonNullableDeep, Paths, Get, SharedUnionFieldsDeep, and similar deep
helpers are hard to detect safely. Manual versions are usually recursive type
programs with valid forms across codebases. A rule would either miss real code or
become an expensive broad traversal over conditional, mapped, and indexed-access
types.
Change-case utilitiesโ
CamelCase, SnakeCase, KebabCase, PascalCase, delimiter-case variants, and
property-case variants should not be enforced from syntax unless the project has
a project-specific local helper name to migrate. Their manual implementations are
type-level parsers, not stable AST patterns.
Numeric computation and branded numeric typesโ
Finite, Integer, NonNegative, IntRange, Sum, Subtract,
GreaterThan, and similar numeric utilities do not have a reliable syntactic
equivalent in normal user code. Rules here would often become name-based
migrations from local aliases, which is too project-specific for a general
plugin rule.
JSON and cloneability typesโ
Jsonify, Jsonifiable, and StructuredCloneable are useful types, but manual
serializability aliases vary heavily by project. A general rule should not guess
that a type named Serializable, JsonCompatible, or Cloneable is equivalent.
Package config typesโ
PackageJson and TsConfigJson are useful, but intent is hard to infer from an
object type alias. A future rule could report local aliases with those exact
names, but broad detection would be noisy.
Closure policyโ
- Do not add more default or recommended autofix rules from this gap list without real-world examples that demonstrate a repeated, low-noise pattern.
- Any future candidate whose semantics differ from the manual form must start suggestion-only or opt-in.
- Autofix candidates must include direct, aliased, and namespace import tests where import-aware; shadowed-name no-fix tests; false-positive valid cases; fixer output assertions; and parse-safety coverage.
- Keep deep transforms, change-case, numeric, JSON, cloneability, package config, and broad type-guard APIs as documented non-goals unless the scope can be narrowed to an exact local-helper migration.