fix(compiler-core): change v-for key type to match Object.keys #10963
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.
close #8819
When using
v-for
with an object of typeT
, the type assigned to the item keys iskeyof T
.Since TS 2.9, calling
keyof {[key: string]: any}
produces a typestring | number
.Behind the scenes, vue calls the
Object.keys
method to produce the keys when usingv-for
. (see L.81 of renderList.ts)Object.keys
's return type beingstring[]
, it sometimes creates a difference between the actual type of the key and the type assigned by vue.One could argue that
keyof
is able to provide stricter typing of the keys in some other cases but microsoft deliberately took the decision of typingObject.keys
that way and doing differently would only induce more confusion.