microsoft / microsoft/TypeScript
Restrict the intellisense/auto completion of mapped tuples depending on the first element of the tuple
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
Bug Report - Intellisense/Auto completion
Typescript can't infer tuple's second element type depending on first one's type
🔎 Search Terms
- Intellisense
- Auto completion
- Mapped tuples
🕗 Versions
- Typescript version
v4.2.3 - VS Code version
v1.55.2
🎈 Context
The goal is to build a text editor with a structure like
Tuple = [Element, ItsAttributes, ...Tuple[]] (with mapped tuples & recursivity)
This will help when I need to construct data with this format
⏯ Payground link
💻 Code
Creation of a type Tuple that only accepts the structure [Element, ItsAttributes] :
interface MyComponents {
Container: {
fluid?: boolean
},
Text: {
text?: string
className?: string
size: number
}
}
//Get the keys of the list of my components
type Element = keyof MyComponents
//Create a mapped tuple type [Element, Attributes]
// and the attributes depend on the element
export type Tuple = {
[Element in keyof MyComponents] : readonly [Element, MyComponents[Element]]
}[keyof MyComponents]
const tuple1 : Tuple = ['Text', { size : 3}] //Okay
const tuple2 : Tuple = ['Text', { fluid : true}] //Throw error
Creation of the editor with all possibles combinations :
type RecursiveDepth = readonly [never, 0, 1, 2, 3, 4, 5, 6, 7, 8]
//Editor
type Editor<N extends number> =
N extends 0
? void
: readonly [...(Tuple) , ...Editor<RecursiveDepth[N]>[]]
| readonly [Element, ...Editor<RecursiveDepth[N]>[]]
| readonly [...(Tuple), string]
| readonly [...(Tuple)]
| readonly [Element, string]
| readonly [Element]
How to use it ?
const data : Editor<3>[] = [
['Container', { fluid: true},
['Text', { size : 3}]
]
]
🙁 Actual behavior
After typing first element, the second element shows all possible attributes (even the wrong ones).
When I choose a wrong one Typescript also knows it's incompatible
Example:
['Container', { /* It currently shows all attributes in MyComponents : fluid, text, className, size */}]
🙂 Expected behavior
After typing first element (Container, Text, etc), Typescript shows only the attributes that belongs to it.
Example:
['Container', { /* Should only show fluid */}]
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il TypeScript Playground collegato e riproduci il comportamento del completamento usando gli esempi di mapped Tuple e Editor ricorsivo. Traccia il modo in cui TypeScript language-service completions gestisce gli elementi discriminati di Tuple, quindi verifica che, dopo aver inserito "Container" o "Text", vengano suggerite solo le proprietà degli attributi corrispondenti, mentre il controllo dei tipi rimane corretto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript, vscode
- Ambito
- compilers, developer-experience
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100