microsoft / microsoft/TypeScript
Restrict the intellisense/auto completion of mapped tuples depending on the first element of the tuple
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
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 */}]
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされている TypeScript Playground から始め、mapped Tuple と再帰的な Editor の例を使って補完の動作を再現します。TypeScript language-service completions が判別可能な Tuple 要素をどのように処理するかを追跡し、その後、"Container" または "Text" を入力した後に、対応する属性プロパティだけが候補として提示され、型チェックも正しく維持されることを確認します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript, vscode
- 領域
- compilers, developer-experience
- issue の種類
- バグ
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100