eslint-plugin-typefest 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1814 -0
- package/LICENSE +21 -0
- package/README.md +282 -0
- package/dist/_internal/array-like-expression.d.ts +67 -0
- package/dist/_internal/array-like-expression.d.ts.map +1 -0
- package/dist/_internal/array-like-expression.js +179 -0
- package/dist/_internal/array-like-expression.js.map +1 -0
- package/dist/_internal/array-method-call-rule.d.ts +34 -0
- package/dist/_internal/array-method-call-rule.d.ts.map +1 -0
- package/dist/_internal/array-method-call-rule.js +49 -0
- package/dist/_internal/array-method-call-rule.js.map +1 -0
- package/dist/_internal/ast-node.d.ts +23 -0
- package/dist/_internal/ast-node.d.ts.map +1 -0
- package/dist/_internal/ast-node.js +38 -0
- package/dist/_internal/ast-node.js.map +1 -0
- package/dist/_internal/bounded-cache.d.ts +42 -0
- package/dist/_internal/bounded-cache.d.ts.map +1 -0
- package/dist/_internal/bounded-cache.js +57 -0
- package/dist/_internal/bounded-cache.js.map +1 -0
- package/dist/_internal/constrained-type-at-location.d.ts +31 -0
- package/dist/_internal/constrained-type-at-location.d.ts.map +1 -0
- package/dist/_internal/constrained-type-at-location.js +61 -0
- package/dist/_internal/constrained-type-at-location.js.map +1 -0
- package/dist/_internal/cycle-safe-linked-search.d.ts +48 -0
- package/dist/_internal/cycle-safe-linked-search.d.ts.map +1 -0
- package/dist/_internal/cycle-safe-linked-search.js +70 -0
- package/dist/_internal/cycle-safe-linked-search.js.map +1 -0
- package/dist/_internal/expression-boolean-memoizer.d.ts +17 -0
- package/dist/_internal/expression-boolean-memoizer.d.ts.map +1 -0
- package/dist/_internal/expression-boolean-memoizer.js +23 -0
- package/dist/_internal/expression-boolean-memoizer.js.map +1 -0
- package/dist/_internal/filter-callback.d.ts +56 -0
- package/dist/_internal/filter-callback.d.ts.map +1 -0
- package/dist/_internal/filter-callback.js +100 -0
- package/dist/_internal/filter-callback.js.map +1 -0
- package/dist/_internal/global-identifier-member-call.d.ts +23 -0
- package/dist/_internal/global-identifier-member-call.d.ts.map +1 -0
- package/dist/_internal/global-identifier-member-call.js +25 -0
- package/dist/_internal/global-identifier-member-call.js.map +1 -0
- package/dist/_internal/global-member-call-rule.d.ts +36 -0
- package/dist/_internal/global-member-call-rule.d.ts.map +1 -0
- package/dist/_internal/global-member-call-rule.js +52 -0
- package/dist/_internal/global-member-call-rule.js.map +1 -0
- package/dist/_internal/import-analysis.d.ts +45 -0
- package/dist/_internal/import-analysis.d.ts.map +1 -0
- package/dist/_internal/import-analysis.js +113 -0
- package/dist/_internal/import-analysis.js.map +1 -0
- package/dist/_internal/import-aware-fixes.d.ts +31 -0
- package/dist/_internal/import-aware-fixes.d.ts.map +1 -0
- package/dist/_internal/import-aware-fixes.js +38 -0
- package/dist/_internal/import-aware-fixes.js.map +1 -0
- package/dist/_internal/import-fix-coordinator.d.ts +43 -0
- package/dist/_internal/import-fix-coordinator.d.ts.map +1 -0
- package/dist/_internal/import-fix-coordinator.js +71 -0
- package/dist/_internal/import-fix-coordinator.js.map +1 -0
- package/dist/_internal/import-insertion.d.ts +27 -0
- package/dist/_internal/import-insertion.d.ts.map +1 -0
- package/dist/_internal/import-insertion.js +295 -0
- package/dist/_internal/import-insertion.js.map +1 -0
- package/dist/_internal/imported-type-aliases.d.ts +140 -0
- package/dist/_internal/imported-type-aliases.d.ts.map +1 -0
- package/dist/_internal/imported-type-aliases.js +316 -0
- package/dist/_internal/imported-type-aliases.js.map +1 -0
- package/dist/_internal/imported-value-symbols.d.ts +157 -0
- package/dist/_internal/imported-value-symbols.d.ts.map +1 -0
- package/dist/_internal/imported-value-symbols.js +478 -0
- package/dist/_internal/imported-value-symbols.js.map +1 -0
- package/dist/_internal/member-call.d.ts +53 -0
- package/dist/_internal/member-call.d.ts.map +1 -0
- package/dist/_internal/member-call.js +48 -0
- package/dist/_internal/member-call.js.map +1 -0
- package/dist/_internal/module-source.d.ts +11 -0
- package/dist/_internal/module-source.d.ts.map +1 -0
- package/dist/_internal/module-source.js +11 -0
- package/dist/_internal/module-source.js.map +1 -0
- package/dist/_internal/normalize-expression-text.d.ts +26 -0
- package/dist/_internal/normalize-expression-text.d.ts.map +1 -0
- package/dist/_internal/normalize-expression-text.js +182 -0
- package/dist/_internal/normalize-expression-text.js.map +1 -0
- package/dist/_internal/nullish-comparison.d.ts +43 -0
- package/dist/_internal/nullish-comparison.d.ts.map +1 -0
- package/dist/_internal/nullish-comparison.js +147 -0
- package/dist/_internal/nullish-comparison.js.map +1 -0
- package/dist/_internal/plugin-settings.d.ts +32 -0
- package/dist/_internal/plugin-settings.d.ts.map +1 -0
- package/dist/_internal/plugin-settings.js +118 -0
- package/dist/_internal/plugin-settings.js.map +1 -0
- package/dist/_internal/report-adapter.d.ts +25 -0
- package/dist/_internal/report-adapter.d.ts.map +1 -0
- package/dist/_internal/report-adapter.js +36 -0
- package/dist/_internal/report-adapter.js.map +1 -0
- package/dist/_internal/rule-catalog.d.ts +51 -0
- package/dist/_internal/rule-catalog.d.ts.map +1 -0
- package/dist/_internal/rule-catalog.js +162 -0
- package/dist/_internal/rule-catalog.js.map +1 -0
- package/dist/_internal/rule-docs-metadata.d.ts +37 -0
- package/dist/_internal/rule-docs-metadata.d.ts.map +1 -0
- package/dist/_internal/rule-docs-metadata.js +192 -0
- package/dist/_internal/rule-docs-metadata.js.map +1 -0
- package/dist/_internal/rule-docs-url.d.ts +15 -0
- package/dist/_internal/rule-docs-url.d.ts.map +1 -0
- package/dist/_internal/rule-docs-url.js +15 -0
- package/dist/_internal/rule-docs-url.js.map +1 -0
- package/dist/_internal/rule-reporting.d.ts +71 -0
- package/dist/_internal/rule-reporting.d.ts.map +1 -0
- package/dist/_internal/rule-reporting.js +89 -0
- package/dist/_internal/rule-reporting.js.map +1 -0
- package/dist/_internal/rules-registry.d.ts +14 -0
- package/dist/_internal/rules-registry.d.ts.map +1 -0
- package/dist/_internal/rules-registry.js +165 -0
- package/dist/_internal/rules-registry.js.map +1 -0
- package/dist/_internal/safe-type-operation.d.ts +89 -0
- package/dist/_internal/safe-type-operation.d.ts.map +1 -0
- package/dist/_internal/safe-type-operation.js +147 -0
- package/dist/_internal/safe-type-operation.js.map +1 -0
- package/dist/_internal/scope-resolution.d.ts +20 -0
- package/dist/_internal/scope-resolution.d.ts.map +1 -0
- package/dist/_internal/scope-resolution.js +21 -0
- package/dist/_internal/scope-resolution.js.map +1 -0
- package/dist/_internal/scope-variable.d.ts +17 -0
- package/dist/_internal/scope-variable.d.ts.map +1 -0
- package/dist/_internal/scope-variable.js +30 -0
- package/dist/_internal/scope-variable.js.map +1 -0
- package/dist/_internal/set-membership.d.ts +6 -0
- package/dist/_internal/set-membership.d.ts.map +1 -0
- package/dist/_internal/set-membership.js +11 -0
- package/dist/_internal/set-membership.js.map +1 -0
- package/dist/_internal/text-character.d.ts +18 -0
- package/dist/_internal/text-character.d.ts.map +1 -0
- package/dist/_internal/text-character.js +69 -0
- package/dist/_internal/text-character.js.map +1 -0
- package/dist/_internal/throw-consequent.d.ts +22 -0
- package/dist/_internal/throw-consequent.d.ts.map +1 -0
- package/dist/_internal/throw-consequent.js +48 -0
- package/dist/_internal/throw-consequent.js.map +1 -0
- package/dist/_internal/throw-type-error.d.ts +19 -0
- package/dist/_internal/throw-type-error.d.ts.map +1 -0
- package/dist/_internal/throw-type-error.js +24 -0
- package/dist/_internal/throw-type-error.js.map +1 -0
- package/dist/_internal/type-checker-compat.d.ts +80 -0
- package/dist/_internal/type-checker-compat.d.ts.map +1 -0
- package/dist/_internal/type-checker-compat.js +104 -0
- package/dist/_internal/type-checker-compat.js.map +1 -0
- package/dist/_internal/type-predicate-autofix-safety.d.ts +20 -0
- package/dist/_internal/type-predicate-autofix-safety.d.ts.map +1 -0
- package/dist/_internal/type-predicate-autofix-safety.js +58 -0
- package/dist/_internal/type-predicate-autofix-safety.js.map +1 -0
- package/dist/_internal/type-reference-node.d.ts +19 -0
- package/dist/_internal/type-reference-node.d.ts.map +1 -0
- package/dist/_internal/type-reference-node.js +14 -0
- package/dist/_internal/type-reference-node.js.map +1 -0
- package/dist/_internal/typed-member-call-rule.d.ts +35 -0
- package/dist/_internal/typed-member-call-rule.d.ts.map +1 -0
- package/dist/_internal/typed-member-call-rule.js +50 -0
- package/dist/_internal/typed-member-call-rule.js.map +1 -0
- package/dist/_internal/typed-path-telemetry.d.ts +58 -0
- package/dist/_internal/typed-path-telemetry.d.ts.map +1 -0
- package/dist/_internal/typed-path-telemetry.js +114 -0
- package/dist/_internal/typed-path-telemetry.js.map +1 -0
- package/dist/_internal/typed-rule.d.ts +142 -0
- package/dist/_internal/typed-rule.d.ts.map +1 -0
- package/dist/_internal/typed-rule.js +197 -0
- package/dist/_internal/typed-rule.js.map +1 -0
- package/dist/_internal/typefest-config-references.d.ts +45 -0
- package/dist/_internal/typefest-config-references.d.ts.map +1 -0
- package/dist/_internal/typefest-config-references.js +98 -0
- package/dist/_internal/typefest-config-references.js.map +1 -0
- package/dist/_internal/typescript-eslint-node-autofix.d.ts +32 -0
- package/dist/_internal/typescript-eslint-node-autofix.d.ts.map +1 -0
- package/dist/_internal/typescript-eslint-node-autofix.js +495 -0
- package/dist/_internal/typescript-eslint-node-autofix.js.map +1 -0
- package/dist/_internal/value-rewrite-autofix-safety.d.ts +33 -0
- package/dist/_internal/value-rewrite-autofix-safety.d.ts.map +1 -0
- package/dist/_internal/value-rewrite-autofix-safety.js +103 -0
- package/dist/_internal/value-rewrite-autofix-safety.js.map +1 -0
- package/dist/plugin.cjs +9718 -0
- package/dist/plugin.cjs.map +7 -0
- package/dist/plugin.d.cts +76 -0
- package/dist/plugin.d.ts +76 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +206 -0
- package/dist/plugin.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-at.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-at.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-at.js +66 -0
- package/dist/rules/prefer-ts-extras-array-at.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-concat.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-concat.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-concat.js +66 -0
- package/dist/rules/prefer-ts-extras-array-concat.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.js +63 -0
- package/dist/rules/prefer-ts-extras-array-find-last-index.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-find-last.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find-last.js +66 -0
- package/dist/rules/prefer-ts-extras-array-find-last.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-find.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-find.js +63 -0
- package/dist/rules/prefer-ts-extras-array-find.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-first.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-first.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-first.js +107 -0
- package/dist/rules/prefer-ts-extras-array-first.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-includes.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-includes.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-includes.js +89 -0
- package/dist/rules/prefer-ts-extras-array-includes.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-join.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-array-join.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-join.js +66 -0
- package/dist/rules/prefer-ts-extras-array-join.js.map +1 -0
- package/dist/rules/prefer-ts-extras-array-last.d.ts +8 -0
- package/dist/rules/prefer-ts-extras-array-last.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-array-last.js +132 -0
- package/dist/rules/prefer-ts-extras-array-last.js.map +1 -0
- package/dist/rules/prefer-ts-extras-as-writable.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-as-writable.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-as-writable.js +110 -0
- package/dist/rules/prefer-ts-extras-as-writable.js.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-defined.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-assert-defined.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-defined.js +182 -0
- package/dist/rules/prefer-ts-extras-assert-defined.js.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-error.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-assert-error.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-error.js +152 -0
- package/dist/rules/prefer-ts-extras-assert-error.js.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-present.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-assert-present.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-assert-present.js +266 -0
- package/dist/rules/prefer-ts-extras-assert-present.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.js +90 -0
- package/dist/rules/prefer-ts-extras-is-defined-filter.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-defined.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-defined.js +179 -0
- package/dist/rules/prefer-ts-extras-is-defined.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-empty.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-empty.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-empty.js +116 -0
- package/dist/rules/prefer-ts-extras-is-empty.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.js +138 -0
- package/dist/rules/prefer-ts-extras-is-equal-type.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-finite.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-finite.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-finite.js +61 -0
- package/dist/rules/prefer-ts-extras-is-finite.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-infinite.d.ts +8 -0
- package/dist/rules/prefer-ts-extras-is-infinite.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-infinite.js +178 -0
- package/dist/rules/prefer-ts-extras-is-infinite.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-integer.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-integer.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-integer.js +61 -0
- package/dist/rules/prefer-ts-extras-is-integer.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.js +216 -0
- package/dist/rules/prefer-ts-extras-is-present-filter.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-present.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-present.js +217 -0
- package/dist/rules/prefer-ts-extras-is-present.js.map +1 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.js +61 -0
- package/dist/rules/prefer-ts-extras-is-safe-integer.js.map +1 -0
- package/dist/rules/prefer-ts-extras-key-in.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-key-in.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-key-in.js +124 -0
- package/dist/rules/prefer-ts-extras-key-in.js.map +1 -0
- package/dist/rules/prefer-ts-extras-not.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-not.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-not.js +136 -0
- package/dist/rules/prefer-ts-extras-not.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-entries.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-entries.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-entries.js +59 -0
- package/dist/rules/prefer-ts-extras-object-entries.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.js +59 -0
- package/dist/rules/prefer-ts-extras-object-from-entries.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-in.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-has-in.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-in.js +79 -0
- package/dist/rules/prefer-ts-extras-object-has-in.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-own.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-has-own.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-has-own.js +82 -0
- package/dist/rules/prefer-ts-extras-object-has-own.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-keys.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-keys.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-keys.js +59 -0
- package/dist/rules/prefer-ts-extras-object-keys.js.map +1 -0
- package/dist/rules/prefer-ts-extras-object-values.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-object-values.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-object-values.js +59 -0
- package/dist/rules/prefer-ts-extras-object-values.js.map +1 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.js +159 -0
- package/dist/rules/prefer-ts-extras-safe-cast-to.js.map +1 -0
- package/dist/rules/prefer-ts-extras-set-has.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-set-has.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-set-has.js +304 -0
- package/dist/rules/prefer-ts-extras-set-has.js.map +1 -0
- package/dist/rules/prefer-ts-extras-string-split.d.ts +13 -0
- package/dist/rules/prefer-ts-extras-string-split.d.ts.map +1 -0
- package/dist/rules/prefer-ts-extras-string-split.js +166 -0
- package/dist/rules/prefer-ts-extras-string-split.js.map +1 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.d.ts +13 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.js +65 -0
- package/dist/rules/prefer-type-fest-abstract-constructor.js.map +1 -0
- package/dist/rules/prefer-type-fest-arrayable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-arrayable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-arrayable.js +123 -0
- package/dist/rules/prefer-type-fest-arrayable.js.map +1 -0
- package/dist/rules/prefer-type-fest-async-return-type.d.ts +13 -0
- package/dist/rules/prefer-type-fest-async-return-type.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-async-return-type.js +92 -0
- package/dist/rules/prefer-type-fest-async-return-type.js.map +1 -0
- package/dist/rules/prefer-type-fest-conditional-pick.d.ts +13 -0
- package/dist/rules/prefer-type-fest-conditional-pick.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-conditional-pick.js +74 -0
- package/dist/rules/prefer-type-fest-conditional-pick.js.map +1 -0
- package/dist/rules/prefer-type-fest-constructor.d.ts +13 -0
- package/dist/rules/prefer-type-fest-constructor.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-constructor.js +67 -0
- package/dist/rules/prefer-type-fest-constructor.js.map +1 -0
- package/dist/rules/prefer-type-fest-except.d.ts +13 -0
- package/dist/rules/prefer-type-fest-except.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-except.js +105 -0
- package/dist/rules/prefer-type-fest-except.js.map +1 -0
- package/dist/rules/prefer-type-fest-if.d.ts +13 -0
- package/dist/rules/prefer-type-fest-if.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-if.js +79 -0
- package/dist/rules/prefer-type-fest-if.js.map +1 -0
- package/dist/rules/prefer-type-fest-iterable-element.d.ts +13 -0
- package/dist/rules/prefer-type-fest-iterable-element.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-iterable-element.js +76 -0
- package/dist/rules/prefer-type-fest-iterable-element.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-array.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-array.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-array.js +164 -0
- package/dist/rules/prefer-type-fest-json-array.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-object.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-object.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-object.js +102 -0
- package/dist/rules/prefer-type-fest-json-object.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-primitive.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-primitive.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-primitive.js +112 -0
- package/dist/rules/prefer-type-fest-json-primitive.js.map +1 -0
- package/dist/rules/prefer-type-fest-json-value.d.ts +13 -0
- package/dist/rules/prefer-type-fest-json-value.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-json-value.js +109 -0
- package/dist/rules/prefer-type-fest-json-value.js.map +1 -0
- package/dist/rules/prefer-type-fest-keys-of-union.d.ts +13 -0
- package/dist/rules/prefer-type-fest-keys-of-union.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-keys-of-union.js +74 -0
- package/dist/rules/prefer-type-fest-keys-of-union.js.map +1 -0
- package/dist/rules/prefer-type-fest-literal-union.d.ts +13 -0
- package/dist/rules/prefer-type-fest-literal-union.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-literal-union.js +181 -0
- package/dist/rules/prefer-type-fest-literal-union.js.map +1 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.d.ts +13 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.js +63 -0
- package/dist/rules/prefer-type-fest-merge-exclusive.js.map +1 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.d.ts +13 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.js +133 -0
- package/dist/rules/prefer-type-fest-non-empty-tuple.js.map +1 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.d.ts +13 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.js +74 -0
- package/dist/rules/prefer-type-fest-omit-index-signature.js.map +1 -0
- package/dist/rules/prefer-type-fest-partial-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-partial-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-partial-deep.js +63 -0
- package/dist/rules/prefer-type-fest-partial-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-primitive.d.ts +13 -0
- package/dist/rules/prefer-type-fest-primitive.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-primitive.js +102 -0
- package/dist/rules/prefer-type-fest-primitive.js.map +1 -0
- package/dist/rules/prefer-type-fest-promisable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-promisable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-promisable.js +167 -0
- package/dist/rules/prefer-type-fest-promisable.js.map +1 -0
- package/dist/rules/prefer-type-fest-readonly-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-readonly-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-readonly-deep.js +63 -0
- package/dist/rules/prefer-type-fest-readonly-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.js +75 -0
- package/dist/rules/prefer-type-fest-require-all-or-none.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.js +74 -0
- package/dist/rules/prefer-type-fest-require-at-least-one.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.js +102 -0
- package/dist/rules/prefer-type-fest-require-exactly-one.js.map +1 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.d.ts +13 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.js +74 -0
- package/dist/rules/prefer-type-fest-require-one-or-none.js.map +1 -0
- package/dist/rules/prefer-type-fest-required-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-required-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-required-deep.js +63 -0
- package/dist/rules/prefer-type-fest-required-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-schema.d.ts +13 -0
- package/dist/rules/prefer-type-fest-schema.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-schema.js +74 -0
- package/dist/rules/prefer-type-fest-schema.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.js +74 -0
- package/dist/rules/prefer-type-fest-set-non-nullable.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-optional.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-optional.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-optional.js +74 -0
- package/dist/rules/prefer-type-fest-set-optional.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-readonly.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-readonly.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-readonly.js +74 -0
- package/dist/rules/prefer-type-fest-set-readonly.js.map +1 -0
- package/dist/rules/prefer-type-fest-set-required.d.ts +13 -0
- package/dist/rules/prefer-type-fest-set-required.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-set-required.js +74 -0
- package/dist/rules/prefer-type-fest-set-required.js.map +1 -0
- package/dist/rules/prefer-type-fest-simplify.d.ts +13 -0
- package/dist/rules/prefer-type-fest-simplify.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-simplify.js +75 -0
- package/dist/rules/prefer-type-fest-simplify.js.map +1 -0
- package/dist/rules/prefer-type-fest-tagged-brands.d.ts +13 -0
- package/dist/rules/prefer-type-fest-tagged-brands.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-tagged-brands.js +174 -0
- package/dist/rules/prefer-type-fest-tagged-brands.js.map +1 -0
- package/dist/rules/prefer-type-fest-tuple-of.d.ts +14 -0
- package/dist/rules/prefer-type-fest-tuple-of.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-tuple-of.js +132 -0
- package/dist/rules/prefer-type-fest-tuple-of.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-array.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-array.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-array.js +111 -0
- package/dist/rules/prefer-type-fest-unknown-array.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-map.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-map.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-map.js +82 -0
- package/dist/rules/prefer-type-fest-unknown-map.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-record.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-record.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-record.js +77 -0
- package/dist/rules/prefer-type-fest-unknown-record.js.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-set.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unknown-set.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unknown-set.js +81 -0
- package/dist/rules/prefer-type-fest-unknown-set.js.map +1 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.d.ts +13 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.js +74 -0
- package/dist/rules/prefer-type-fest-unwrap-tagged.js.map +1 -0
- package/dist/rules/prefer-type-fest-value-of.d.ts +13 -0
- package/dist/rules/prefer-type-fest-value-of.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-value-of.js +74 -0
- package/dist/rules/prefer-type-fest-value-of.js.map +1 -0
- package/dist/rules/prefer-type-fest-writable-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-writable-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-writable-deep.js +64 -0
- package/dist/rules/prefer-type-fest-writable-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-writable.d.ts +13 -0
- package/dist/rules/prefer-type-fest-writable.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-writable.js +129 -0
- package/dist/rules/prefer-type-fest-writable.js.map +1 -0
- package/docs/rules/getting-started.md +74 -0
- package/docs/rules/guides/adoption-checklist.md +37 -0
- package/docs/rules/guides/preset-selection-strategy.md +87 -0
- package/docs/rules/guides/rollout-and-fix-safety.md +42 -0
- package/docs/rules/guides/snapshot-testing.md +121 -0
- package/docs/rules/guides/type-aware-linting-readiness.md +105 -0
- package/docs/rules/overview.md +49 -0
- package/docs/rules/prefer-ts-extras-array-at.md +132 -0
- package/docs/rules/prefer-ts-extras-array-concat.md +138 -0
- package/docs/rules/prefer-ts-extras-array-find-last-index.md +108 -0
- package/docs/rules/prefer-ts-extras-array-find-last.md +108 -0
- package/docs/rules/prefer-ts-extras-array-find.md +108 -0
- package/docs/rules/prefer-ts-extras-array-first.md +132 -0
- package/docs/rules/prefer-ts-extras-array-includes.md +135 -0
- package/docs/rules/prefer-ts-extras-array-join.md +132 -0
- package/docs/rules/prefer-ts-extras-array-last.md +132 -0
- package/docs/rules/prefer-ts-extras-as-writable.md +124 -0
- package/docs/rules/prefer-ts-extras-assert-defined.md +140 -0
- package/docs/rules/prefer-ts-extras-assert-error.md +147 -0
- package/docs/rules/prefer-ts-extras-assert-present.md +139 -0
- package/docs/rules/prefer-ts-extras-is-defined-filter.md +125 -0
- package/docs/rules/prefer-ts-extras-is-defined.md +147 -0
- package/docs/rules/prefer-ts-extras-is-empty.md +142 -0
- package/docs/rules/prefer-ts-extras-is-equal-type.md +144 -0
- package/docs/rules/prefer-ts-extras-is-finite.md +116 -0
- package/docs/rules/prefer-ts-extras-is-infinite.md +134 -0
- package/docs/rules/prefer-ts-extras-is-integer.md +116 -0
- package/docs/rules/prefer-ts-extras-is-present-filter.md +125 -0
- package/docs/rules/prefer-ts-extras-is-present.md +143 -0
- package/docs/rules/prefer-ts-extras-is-safe-integer.md +116 -0
- package/docs/rules/prefer-ts-extras-key-in.md +150 -0
- package/docs/rules/prefer-ts-extras-not.md +138 -0
- package/docs/rules/prefer-ts-extras-object-entries.md +130 -0
- package/docs/rules/prefer-ts-extras-object-from-entries.md +131 -0
- package/docs/rules/prefer-ts-extras-object-has-in.md +141 -0
- package/docs/rules/prefer-ts-extras-object-has-own.md +137 -0
- package/docs/rules/prefer-ts-extras-object-keys.md +127 -0
- package/docs/rules/prefer-ts-extras-object-values.md +128 -0
- package/docs/rules/prefer-ts-extras-safe-cast-to.md +130 -0
- package/docs/rules/prefer-ts-extras-set-has.md +203 -0
- package/docs/rules/prefer-ts-extras-string-split.md +133 -0
- package/docs/rules/prefer-type-fest-abstract-constructor.md +87 -0
- package/docs/rules/prefer-type-fest-arrayable.md +127 -0
- package/docs/rules/prefer-type-fest-async-return-type.md +117 -0
- package/docs/rules/prefer-type-fest-conditional-pick.md +140 -0
- package/docs/rules/prefer-type-fest-constructor.md +87 -0
- package/docs/rules/prefer-type-fest-except.md +231 -0
- package/docs/rules/prefer-type-fest-if.md +217 -0
- package/docs/rules/prefer-type-fest-iterable-element.md +170 -0
- package/docs/rules/prefer-type-fest-json-array.md +107 -0
- package/docs/rules/prefer-type-fest-json-object.md +107 -0
- package/docs/rules/prefer-type-fest-json-primitive.md +105 -0
- package/docs/rules/prefer-type-fest-json-value.md +107 -0
- package/docs/rules/prefer-type-fest-keys-of-union.md +139 -0
- package/docs/rules/prefer-type-fest-literal-union.md +118 -0
- package/docs/rules/prefer-type-fest-merge-exclusive.md +118 -0
- package/docs/rules/prefer-type-fest-non-empty-tuple.md +115 -0
- package/docs/rules/prefer-type-fest-omit-index-signature.md +196 -0
- package/docs/rules/prefer-type-fest-partial-deep.md +133 -0
- package/docs/rules/prefer-type-fest-primitive.md +106 -0
- package/docs/rules/prefer-type-fest-promisable.md +246 -0
- package/docs/rules/prefer-type-fest-readonly-deep.md +151 -0
- package/docs/rules/prefer-type-fest-require-all-or-none.md +149 -0
- package/docs/rules/prefer-type-fest-require-at-least-one.md +155 -0
- package/docs/rules/prefer-type-fest-require-exactly-one.md +240 -0
- package/docs/rules/prefer-type-fest-require-one-or-none.md +165 -0
- package/docs/rules/prefer-type-fest-required-deep.md +123 -0
- package/docs/rules/prefer-type-fest-schema.md +161 -0
- package/docs/rules/prefer-type-fest-set-non-nullable.md +145 -0
- package/docs/rules/prefer-type-fest-set-optional.md +133 -0
- package/docs/rules/prefer-type-fest-set-readonly.md +136 -0
- package/docs/rules/prefer-type-fest-set-required.md +140 -0
- package/docs/rules/prefer-type-fest-simplify.md +168 -0
- package/docs/rules/prefer-type-fest-tagged-brands.md +278 -0
- package/docs/rules/prefer-type-fest-tuple-of.md +250 -0
- package/docs/rules/prefer-type-fest-unknown-array.md +126 -0
- package/docs/rules/prefer-type-fest-unknown-map.md +123 -0
- package/docs/rules/prefer-type-fest-unknown-record.md +130 -0
- package/docs/rules/prefer-type-fest-unknown-set.md +123 -0
- package/docs/rules/prefer-type-fest-unwrap-tagged.md +133 -0
- package/docs/rules/prefer-type-fest-value-of.md +121 -0
- package/docs/rules/prefer-type-fest-writable-deep.md +113 -0
- package/docs/rules/prefer-type-fest-writable.md +139 -0
- package/docs/rules/presets/all.md +102 -0
- package/docs/rules/presets/index.md +124 -0
- package/docs/rules/presets/minimal.md +37 -0
- package/docs/rules/presets/recommended-type-checked.md +37 -0
- package/docs/rules/presets/recommended.md +116 -0
- package/docs/rules/presets/strict.md +98 -0
- package/docs/rules/presets/ts-extras-type-guards.md +45 -0
- package/docs/rules/presets/type-fest-types.md +68 -0
- package/package.json +574 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# prefer-type-fest-tagged-brands
|
|
2
|
+
|
|
3
|
+
Prefers TypeFest `Tagged` for branded primitive identifiers over ad-hoc `__brand`/`__tag` intersection patterns.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule targets ad-hoc brand-marker intersections and legacy alias names used for branded primitives.
|
|
8
|
+
|
|
9
|
+
## What this rule reports
|
|
10
|
+
|
|
11
|
+
- Type aliases that use intersection branding with explicit brand-marker fields.
|
|
12
|
+
- Type references that resolve to imported `Opaque` / `Branded` aliases.
|
|
13
|
+
- Existing `Tagged` usage is ignored.
|
|
14
|
+
|
|
15
|
+
### Detection boundaries
|
|
16
|
+
|
|
17
|
+
- ✅ Reports ad-hoc brand-marker intersections by default.
|
|
18
|
+
- ✅ Reports imported `Opaque` / `Branded` aliases by default.
|
|
19
|
+
- ❌ Does not report namespace-qualified alias usage.
|
|
20
|
+
- ✅ Auto-fixes imported legacy alias references to `Tagged` when replacement is syntactically safe.
|
|
21
|
+
- ❌ Does not auto-fix ad-hoc intersection branding declarations.
|
|
22
|
+
- ✅ Enforcement surface is configurable with `enforceAdHocBrandIntersections` and `enforceLegacyAliases`.
|
|
23
|
+
|
|
24
|
+
## Why this rule exists
|
|
25
|
+
|
|
26
|
+
`Tagged` provides a standard, reusable branded-type approach that improves consistency and readability.
|
|
27
|
+
|
|
28
|
+
## ❌ Incorrect
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
type UserId = string & { readonly __brand: "UserId" };
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## ✅ Correct
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
type UserId = Tagged<string, "UserId">;
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Behavior and migration notes
|
|
41
|
+
|
|
42
|
+
- `Tagged<Base, Tag>` standardizes branded identity types.
|
|
43
|
+
- This rule targets both structural brand fields (`__brand`, `__tag`) and legacy alias references (`Opaque`, `Branded`).
|
|
44
|
+
- Use canonical `Tagged` aliases for IDs and domain markers to keep branding semantics consistent across packages.
|
|
45
|
+
|
|
46
|
+
### Options
|
|
47
|
+
|
|
48
|
+
This rule accepts a single options object:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
type PreferTypeFestTaggedBrandsOptions = {
|
|
52
|
+
/**
|
|
53
|
+
* Whether to report structural ad-hoc branding intersections.
|
|
54
|
+
*
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
57
|
+
enforceAdHocBrandIntersections?: boolean;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Whether to report imported legacy aliases like Opaque/Branded.
|
|
61
|
+
*
|
|
62
|
+
* @default true
|
|
63
|
+
*/
|
|
64
|
+
enforceLegacyAliases?: boolean;
|
|
65
|
+
};
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Default configuration:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
{
|
|
72
|
+
enforceAdHocBrandIntersections: true,
|
|
73
|
+
enforceLegacyAliases: true,
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Flat config setup (default behavior):
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import typefest from "eslint-plugin-typefest";
|
|
81
|
+
|
|
82
|
+
export default [
|
|
83
|
+
{
|
|
84
|
+
plugins: { typefest },
|
|
85
|
+
rules: {
|
|
86
|
+
"typefest/prefer-type-fest-tagged-brands": [
|
|
87
|
+
"error",
|
|
88
|
+
{
|
|
89
|
+
enforceAdHocBrandIntersections: true,
|
|
90
|
+
enforceLegacyAliases: true,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### `enforceAdHocBrandIntersections: false`
|
|
99
|
+
|
|
100
|
+
Ignores structural ad-hoc intersections, while still reporting legacy aliases:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import typefest from "eslint-plugin-typefest";
|
|
104
|
+
|
|
105
|
+
export default [
|
|
106
|
+
{
|
|
107
|
+
plugins: { typefest },
|
|
108
|
+
rules: {
|
|
109
|
+
"typefest/prefer-type-fest-tagged-brands": [
|
|
110
|
+
"error",
|
|
111
|
+
{
|
|
112
|
+
enforceAdHocBrandIntersections: false,
|
|
113
|
+
enforceLegacyAliases: true,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
import type { Opaque } from "type-aliases";
|
|
123
|
+
|
|
124
|
+
type A = string & { readonly __brand: "UserId" }; // ✅ Not reported
|
|
125
|
+
type B = Opaque<string, "UserId">; // ❌ Reported
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### `enforceLegacyAliases: false`
|
|
129
|
+
|
|
130
|
+
Ignores imported `Opaque`/`Branded` aliases, while still reporting ad-hoc intersections:
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
import typefest from "eslint-plugin-typefest";
|
|
134
|
+
|
|
135
|
+
export default [
|
|
136
|
+
{
|
|
137
|
+
plugins: { typefest },
|
|
138
|
+
rules: {
|
|
139
|
+
"typefest/prefer-type-fest-tagged-brands": [
|
|
140
|
+
"error",
|
|
141
|
+
{
|
|
142
|
+
enforceAdHocBrandIntersections: true,
|
|
143
|
+
enforceLegacyAliases: false,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import type { Opaque } from "type-aliases";
|
|
153
|
+
|
|
154
|
+
type A = Opaque<string, "UserId">; // ✅ Not reported
|
|
155
|
+
type B = string & { readonly __brand: "UserId" }; // ❌ Reported
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Additional examples
|
|
159
|
+
|
|
160
|
+
### ❌ Incorrect — Additional example
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
type OrderId = string & { readonly __tag: "OrderId" };
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### ✅ Correct — Additional example
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
type OrderId = Tagged<string, "OrderId">;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### ✅ Correct — Repository-wide usage
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
type TenantId = Tagged<string, "TenantId">;
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## ESLint flat config example
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
import typefest from "eslint-plugin-typefest";
|
|
182
|
+
|
|
183
|
+
export default [
|
|
184
|
+
{
|
|
185
|
+
plugins: { typefest },
|
|
186
|
+
rules: {
|
|
187
|
+
"typefest/prefer-type-fest-tagged-brands": "error",
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## When not to use it
|
|
194
|
+
|
|
195
|
+
Disable this rule if existing brand encodings must remain for backward compatibility.
|
|
196
|
+
|
|
197
|
+
## Package documentation
|
|
198
|
+
|
|
199
|
+
TypeFest package documentation:
|
|
200
|
+
|
|
201
|
+
Source file: [`source/tagged.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/tagged.d.ts)
|
|
202
|
+
|
|
203
|
+
````ts
|
|
204
|
+
/**
|
|
205
|
+
Attach a "tag" to an arbitrary type. This allows you to create distinct types, that aren't assignable to one another, for distinct concepts in your program that should not be interchangeable, even if their runtime values have the same type. (See examples.)
|
|
206
|
+
|
|
207
|
+
A type returned by `Tagged` can be passed to `Tagged` again, to create a type with multiple tags.
|
|
208
|
+
|
|
209
|
+
[Read more about tagged types.](https://medium.com/@KevinBGreene/surviving-the-typescript-ecosystem-branding-and-type-tagging-6cf6e516523d)
|
|
210
|
+
|
|
211
|
+
A tag's name is usually a string (and must be a string, number, or symbol), but each application of a tag can also contain an arbitrary type as its "metadata". See {@link GetTagMetadata} for examples and explanation.
|
|
212
|
+
|
|
213
|
+
A type `A` returned by `Tagged` is assignable to another type `B` returned by `Tagged` if and only if:
|
|
214
|
+
- the underlying (untagged) type of `A` is assignable to the underlying type of `B`;
|
|
215
|
+
- `A` contains at least all the tags `B` has;
|
|
216
|
+
- and the metadata type for each of `A`'s tags is assignable to the metadata type of `B`'s corresponding tag.
|
|
217
|
+
|
|
218
|
+
There have been several discussions about adding similar features to TypeScript. Unfortunately, nothing has (yet) moved forward:
|
|
219
|
+
- [Microsoft/TypeScript#202](https://github.com/microsoft/TypeScript/issues/202)
|
|
220
|
+
- [Microsoft/TypeScript#4895](https://github.com/microsoft/TypeScript/issues/4895)
|
|
221
|
+
- [Microsoft/TypeScript#33290](https://github.com/microsoft/TypeScript/pull/33290)
|
|
222
|
+
|
|
223
|
+
@example
|
|
224
|
+
```
|
|
225
|
+
import type {Tagged} from 'type-fest';
|
|
226
|
+
|
|
227
|
+
type AccountNumber = Tagged<number, 'AccountNumber'>;
|
|
228
|
+
type AccountBalance = Tagged<number, 'AccountBalance'>;
|
|
229
|
+
|
|
230
|
+
function createAccountNumber(): AccountNumber {
|
|
231
|
+
// As you can see, casting from a `number` (the underlying type being tagged) is allowed.
|
|
232
|
+
return 2 as AccountNumber;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
declare function getMoneyForAccount(accountNumber: AccountNumber): AccountBalance;
|
|
236
|
+
|
|
237
|
+
// This will compile successfully.
|
|
238
|
+
getMoneyForAccount(createAccountNumber());
|
|
239
|
+
|
|
240
|
+
// But this won't, because it has to be explicitly passed as an `AccountNumber` type!
|
|
241
|
+
// Critically, you could not accidentally use an `AccountBalance` as an `AccountNumber`.
|
|
242
|
+
// @ts-expect-error
|
|
243
|
+
getMoneyForAccount(2);
|
|
244
|
+
|
|
245
|
+
// You can also use tagged values like their underlying, untagged type.
|
|
246
|
+
// I.e., this will compile successfully because an `AccountNumber` can be used as a regular `number`.
|
|
247
|
+
// In this sense, the underlying base type is not hidden, which differentiates tagged types from opaque types in other languages.
|
|
248
|
+
const accountNumber = createAccountNumber() + 2;
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
@example
|
|
252
|
+
```
|
|
253
|
+
import type {Tagged} from 'type-fest';
|
|
254
|
+
|
|
255
|
+
// You can apply multiple tags to a type by using `Tagged` repeatedly.
|
|
256
|
+
type Url = Tagged<string, 'URL'>;
|
|
257
|
+
type SpecialCacheKey = Tagged<Url, 'SpecialCacheKey'>;
|
|
258
|
+
|
|
259
|
+
// You can also pass a union of tag names, so this is equivalent to the above, although it doesn't give you the ability to assign distinct metadata to each tag.
|
|
260
|
+
type SpecialCacheKey2 = Tagged<string, 'URL' | 'SpecialCacheKey'>;
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
@category Type
|
|
264
|
+
*/
|
|
265
|
+
````
|
|
266
|
+
|
|
267
|
+
> **Rule catalog ID:** R067
|
|
268
|
+
|
|
269
|
+
## Further reading
|
|
270
|
+
|
|
271
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
272
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
273
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
274
|
+
|
|
275
|
+
## Adoption resources
|
|
276
|
+
|
|
277
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
278
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# prefer-type-fest-tuple-of
|
|
2
|
+
|
|
3
|
+
Require `Readonly<TupleOf<Length, Element>>` over imported aliases like
|
|
4
|
+
`ReadonlyTuple`.
|
|
5
|
+
|
|
6
|
+
## Targeted pattern scope
|
|
7
|
+
|
|
8
|
+
This rule targets deprecated `ReadonlyTuple` and `Tuple` alias usage.
|
|
9
|
+
|
|
10
|
+
## What this rule reports
|
|
11
|
+
|
|
12
|
+
- Type references that resolve to imported `ReadonlyTuple` aliases.
|
|
13
|
+
- Type references that resolve to imported `Tuple` aliases.
|
|
14
|
+
|
|
15
|
+
### Detection boundaries
|
|
16
|
+
|
|
17
|
+
- ✅ Reports imported aliases with direct named imports.
|
|
18
|
+
- ❌ Does not report namespace-qualified alias usage.
|
|
19
|
+
- ✅ Auto-fixes imported alias references to canonical `TupleOf` forms when replacement is syntactically safe.
|
|
20
|
+
- ✅ Alias coverage is configurable with `enforcedAliasNames`.
|
|
21
|
+
|
|
22
|
+
## Why this rule exists
|
|
23
|
+
|
|
24
|
+
`ReadonlyTuple` is deprecated in TypeFest. The canonical replacement is
|
|
25
|
+
`Readonly<TupleOf<Length, Element>>`, which keeps readonly semantics explicit
|
|
26
|
+
while using the supported tuple utility.
|
|
27
|
+
|
|
28
|
+
## ❌ Incorrect
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import type { ReadonlyTuple } from "type-fest";
|
|
32
|
+
|
|
33
|
+
type Digits = ReadonlyTuple<number, 4>;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## ✅ Correct
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import type { TupleOf } from "type-fest";
|
|
40
|
+
|
|
41
|
+
type Digits = Readonly<TupleOf<4, number>>;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Behavior and migration notes
|
|
45
|
+
|
|
46
|
+
- `ReadonlyTuple<Element, Length>` is deprecated in favor of `Readonly<TupleOf<Length, Element>>`.
|
|
47
|
+
- `Tuple<Element, Length>` is deprecated in favor of `TupleOf<Length, Element>`.
|
|
48
|
+
- This rule migrates deprecated TypeFest tuple naming toward supported utilities.
|
|
49
|
+
- Keep readonly wrapping explicit so mutability intent remains visible at call sites.
|
|
50
|
+
|
|
51
|
+
### Options
|
|
52
|
+
|
|
53
|
+
This rule accepts a single options object:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
type PreferTypeFestTupleOfOptions = {
|
|
57
|
+
/**
|
|
58
|
+
* Legacy alias names that this rule will report and replace.
|
|
59
|
+
*
|
|
60
|
+
* @default ["ReadonlyTuple", "Tuple"]
|
|
61
|
+
*/
|
|
62
|
+
enforcedAliasNames?: ("ReadonlyTuple" | "Tuple")[];
|
|
63
|
+
};
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Default configuration:
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
{
|
|
70
|
+
enforcedAliasNames: ["ReadonlyTuple", "Tuple"],
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Flat config setup (default behavior):
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import typefest from "eslint-plugin-typefest";
|
|
78
|
+
|
|
79
|
+
export default [
|
|
80
|
+
{
|
|
81
|
+
plugins: { typefest },
|
|
82
|
+
rules: {
|
|
83
|
+
"typefest/prefer-type-fest-tuple-of": [
|
|
84
|
+
"error",
|
|
85
|
+
{ enforcedAliasNames: ["ReadonlyTuple", "Tuple"] },
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
#### `enforcedAliasNames: ["ReadonlyTuple", "Tuple"]` (default)
|
|
93
|
+
|
|
94
|
+
Reports both legacy aliases.
|
|
95
|
+
|
|
96
|
+
#### `enforcedAliasNames: ["Tuple"]`
|
|
97
|
+
|
|
98
|
+
Reports only `Tuple` and ignores `ReadonlyTuple`:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import typefest from "eslint-plugin-typefest";
|
|
102
|
+
|
|
103
|
+
export default [
|
|
104
|
+
{
|
|
105
|
+
plugins: { typefest },
|
|
106
|
+
rules: {
|
|
107
|
+
"typefest/prefer-type-fest-tuple-of": [
|
|
108
|
+
"error",
|
|
109
|
+
{ enforcedAliasNames: ["Tuple"] },
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import type { ReadonlyTuple, Tuple } from "type-aliases";
|
|
118
|
+
|
|
119
|
+
type A = ReadonlyTuple<string, 3>; // ✅ Not reported
|
|
120
|
+
type B = Tuple<string, 3>; // ❌ Reported
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Additional examples
|
|
124
|
+
|
|
125
|
+
### ❌ Incorrect — Additional example
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
import type { ReadonlyTuple } from "type-fest";
|
|
129
|
+
|
|
130
|
+
type IPv4 = ReadonlyTuple<number, 4>;
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### ✅ Correct — Additional example
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import type { TupleOf } from "type-fest";
|
|
137
|
+
|
|
138
|
+
type IPv4 = Readonly<TupleOf<4, number>>;
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### ✅ Correct — Repository-wide usage
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
type RGB = TupleOf<3, number>;
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## ESLint flat config example
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
import typefest from "eslint-plugin-typefest";
|
|
151
|
+
|
|
152
|
+
export default [
|
|
153
|
+
{
|
|
154
|
+
plugins: { typefest },
|
|
155
|
+
rules: {
|
|
156
|
+
"typefest/prefer-type-fest-tuple-of": "error",
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## When not to use it
|
|
163
|
+
|
|
164
|
+
Disable this rule if compatibility constraints require preserving deprecated aliases.
|
|
165
|
+
|
|
166
|
+
## Package documentation
|
|
167
|
+
|
|
168
|
+
TypeFest package documentation:
|
|
169
|
+
|
|
170
|
+
Source file: [`source/tuple-of.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/tuple-of.d.ts)
|
|
171
|
+
|
|
172
|
+
````ts
|
|
173
|
+
/**
|
|
174
|
+
Create a tuple type of the specified length with elements of the specified type.
|
|
175
|
+
|
|
176
|
+
@example
|
|
177
|
+
```
|
|
178
|
+
import type {TupleOf} from 'type-fest';
|
|
179
|
+
|
|
180
|
+
type RGB = TupleOf<3, number>;
|
|
181
|
+
//=> [number, number, number]
|
|
182
|
+
|
|
183
|
+
type Line = TupleOf<2, {x: number; y: number}>;
|
|
184
|
+
//=> [{x: number; y: number}, {x: number; y: number}]
|
|
185
|
+
|
|
186
|
+
type TicTacToeBoard = TupleOf<3, TupleOf<3, 'X' | 'O' | null>>;
|
|
187
|
+
//=> [['X' | 'O' | null, 'X' | 'O' | null, 'X' | 'O' | null], ['X' | 'O' | null, 'X' | 'O' | null, 'X' | 'O' | null], ['X' | 'O' | null, 'X' | 'O' | null, 'X' | 'O' | null]]
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
@example
|
|
191
|
+
```
|
|
192
|
+
import type {TupleOf} from 'type-fest';
|
|
193
|
+
|
|
194
|
+
type Range<Start extends number, End extends number> = Exclude<keyof TupleOf<End>, keyof TupleOf<Start>>;
|
|
195
|
+
|
|
196
|
+
type ZeroToFour = Range<0, 5>;
|
|
197
|
+
//=> '0' | '1' | '2' | '3' | '4'
|
|
198
|
+
|
|
199
|
+
type ThreeToEight = Range<3, 9>;
|
|
200
|
+
//=> '5' | '3' | '4' | '6' | '7' | '8'
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Note: If the specified length is the non-literal `number` type, the result will not be a tuple but a regular array.
|
|
204
|
+
|
|
205
|
+
@example
|
|
206
|
+
```
|
|
207
|
+
import type {TupleOf} from 'type-fest';
|
|
208
|
+
|
|
209
|
+
type StringArray = TupleOf<number, string>;
|
|
210
|
+
//=> string[]
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Note: If the type for elements is not specified, it will default to `unknown`.
|
|
214
|
+
|
|
215
|
+
@example
|
|
216
|
+
```
|
|
217
|
+
import type {TupleOf} from 'type-fest';
|
|
218
|
+
|
|
219
|
+
type UnknownTriplet = TupleOf<3>;
|
|
220
|
+
//=> [unknown, unknown, unknown]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Note: If the specified length is negative, the result will be an empty tuple.
|
|
224
|
+
|
|
225
|
+
@example
|
|
226
|
+
```
|
|
227
|
+
import type {TupleOf} from 'type-fest';
|
|
228
|
+
|
|
229
|
+
type EmptyTuple = TupleOf<-3, string>;
|
|
230
|
+
//=> []
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Note: If you need a readonly tuple, simply wrap this type with `Readonly`, for example, to create `readonly [number, number, number]` use `Readonly<TupleOf<3, number>>`.
|
|
234
|
+
|
|
235
|
+
@category Array
|
|
236
|
+
*/
|
|
237
|
+
````
|
|
238
|
+
|
|
239
|
+
> **Rule catalog ID:** R068
|
|
240
|
+
|
|
241
|
+
## Further reading
|
|
242
|
+
|
|
243
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
244
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
245
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
246
|
+
|
|
247
|
+
## Adoption resources
|
|
248
|
+
|
|
249
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
250
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# prefer-type-fest-unknown-array
|
|
2
|
+
|
|
3
|
+
Require TypeFest [`UnknownArray`](https://github.com/sindresorhus/type-fest/blob/main/source/unknown-array.d.ts) over `readonly unknown[]` and `ReadonlyArray<unknown>`.
|
|
4
|
+
|
|
5
|
+
## Targeted pattern scope
|
|
6
|
+
|
|
7
|
+
This rule targets explicit unknown-array spellings that TypeFest standardizes as `UnknownArray`.
|
|
8
|
+
|
|
9
|
+
- `readonly unknown[]`
|
|
10
|
+
- `ReadonlyArray<unknown>`
|
|
11
|
+
|
|
12
|
+
Other collection contracts are left alone unless they match the exact unknown collection form listed below.
|
|
13
|
+
|
|
14
|
+
## What this rule reports
|
|
15
|
+
|
|
16
|
+
This rule reports unknown-array type forms that should migrate to `UnknownArray`.
|
|
17
|
+
|
|
18
|
+
- `readonly unknown[]`
|
|
19
|
+
- `ReadonlyArray<unknown>`
|
|
20
|
+
|
|
21
|
+
## Why this rule exists
|
|
22
|
+
|
|
23
|
+
`UnknownArray` provides a clearer, shared alias for unknown element arrays and keeps utility-type usage consistent with other TypeFest-first conventions.
|
|
24
|
+
|
|
25
|
+
## ❌ Incorrect
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
type Values = readonly unknown[];
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## ✅ Correct
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
type Values = UnknownArray;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Behavior and migration notes
|
|
38
|
+
|
|
39
|
+
- `UnknownArray` is the canonical alias for readonly unknown-element arrays in `type-fest` style.
|
|
40
|
+
- This rule normalizes `readonly unknown[]` and `ReadonlyArray<unknown>` into one shared name.
|
|
41
|
+
- Use this alias for untyped collection ingress points before narrowing.
|
|
42
|
+
|
|
43
|
+
## Additional examples
|
|
44
|
+
|
|
45
|
+
### ❌ Incorrect — Additional example
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
type Input = readonly unknown[];
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### ✅ Correct — Additional example
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
type Input = UnknownArray;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### ✅ Correct — Repository-wide usage
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
type PayloadList = UnknownArray;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## ESLint flat config example
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import typefest from "eslint-plugin-typefest";
|
|
67
|
+
|
|
68
|
+
export default [
|
|
69
|
+
{
|
|
70
|
+
plugins: { typefest },
|
|
71
|
+
rules: {
|
|
72
|
+
"typefest/prefer-type-fest-unknown-array": "error",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## When not to use it
|
|
79
|
+
|
|
80
|
+
Disable this rule if external API signatures must preserve existing alias names.
|
|
81
|
+
|
|
82
|
+
## Package documentation
|
|
83
|
+
|
|
84
|
+
TypeFest package documentation:
|
|
85
|
+
|
|
86
|
+
Source file: [`source/unknown-array.d.ts`](https://github.com/sindresorhus/type-fest/blob/main/source/unknown-array.d.ts)
|
|
87
|
+
|
|
88
|
+
````ts
|
|
89
|
+
/**
|
|
90
|
+
Represents an array with `unknown` value.
|
|
91
|
+
|
|
92
|
+
Use case: You want a type that all arrays can be assigned to, but you don't care about the value.
|
|
93
|
+
|
|
94
|
+
@example
|
|
95
|
+
```
|
|
96
|
+
import type {UnknownArray} from 'type-fest';
|
|
97
|
+
|
|
98
|
+
type IsArray<T> = T extends UnknownArray ? true : false;
|
|
99
|
+
|
|
100
|
+
type A = IsArray<['foo']>;
|
|
101
|
+
//=> true
|
|
102
|
+
|
|
103
|
+
type B = IsArray<readonly number[]>;
|
|
104
|
+
//=> true
|
|
105
|
+
|
|
106
|
+
type C = IsArray<string>;
|
|
107
|
+
//=> false
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
@category Type
|
|
111
|
+
@category Array
|
|
112
|
+
*/
|
|
113
|
+
````
|
|
114
|
+
|
|
115
|
+
> **Rule catalog ID:** R069
|
|
116
|
+
|
|
117
|
+
## Further reading
|
|
118
|
+
|
|
119
|
+
- [`type-fest` README](https://github.com/sindresorhus/type-fest)
|
|
120
|
+
- [`type-fest` npm documentation](https://www.npmjs.com/package/type-fest)
|
|
121
|
+
- [TypeScript Handbook: Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)
|
|
122
|
+
|
|
123
|
+
## Adoption resources
|
|
124
|
+
|
|
125
|
+
- [Rule adoption checklist](./guides/adoption-checklist.md)
|
|
126
|
+
- [Rollout and fix safety](./guides/rollout-and-fix-safety.md)
|