Microsoft/TypeScript
在 GitHub 查看Incorrect inference/autocompletion on generic arrays, when values can be inferred from a defined object.
Open
#41,645 创建于 2020年11月23日
Domain: LS: Completion ListsEffort: ModerateExperience EnhancementExperimentation NeededHelp WantedSuggestion
描述
TypeScript Version: 4.1.2
Search Terms: Autocompletion, incorrect, values, inference, generic, array, object, keys
Summary: When an interface/a type has an object with generic keys, and an array of those keys, the array values cannot be infered from the object keys.
Code
interface Recipe<INGREDIENTS extends string> {
quantities: Record<INGREDIENTS, number>
allergens?: INGREDIENTS[]
}
function createRecipe<INGREDIENTS extends string>(recipe: Recipe<INGREDIENTS>) {}
createRecipe({
quantities: {
eggs: 1,
flour: 2,
},
allergens: ['']
})
Expected behavior:
Here, when trying to give a value to allergens, the autocompletion should show "eggs" | "flour".
Actual behavior:
The autocompletion doesn't find anything.

Notes: The other way is working: you can fill the array first, then the object keys will autocomplete - but this rarely make sense to write things that way.
Failed workarounds: This bug is still present, even when:
allergensis optionnal- We switch from an interface to a type
- We use
keyof this['quantities']instead ofINGREDIENTS[]