Use NoInfer in GetTagMetadata to prevent inference widening - #1418
Open
tamish-max wants to merge 1 commit into
Open
tamish-max wants to merge 1 commit into
tamish-max wants to merge 1 commit into
Conversation
Closes sindresorhus#848 After auditing all exported types, GetTagMetadata is the only type where NoInfer applies — TagName appears in both the constraint (Tag<TagName, unknown>) and as a standalone parameter, creating competing inference sites. When Type carries multiple tags, TypeScript could widen TagName from the structural shape of Type. NoInfer suppresses this, ensuring TagName is inferred only from the explicit argument. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #848
Summary
After auditing all exported types in
source/,GetTagMetadatais the only type whereNoInfer(TS 5.4+) is applicable.TagNameappears in both the constraint (Tag<TagName, unknown>) and as a standalone parameter, creating competing inference sites. WhenTypecarries multiple tags, TypeScript could widenTagNamefrom the structural shape.Change
Why only GetTagMetadata?
All other types were reviewed.
NoInferrequires: (1) a type param in a constraint AND as a standalone param, (2) competing inference sites that can conflict. Most type-fest types useextends inferfor computation captures or have single inference sites — neither pattern benefits fromNoInfer.Test
Added multi-tag test in
test-d/opaque.tsverifying precise metadata recovery when a type carries multiple tags.