Skip to content

Commit 4b0d4f3

Browse files
committed
Support conditional types
1 parent cbac0d4 commit 4b0d4f3

File tree

5 files changed

+326
-0
lines changed

5 files changed

+326
-0
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,6 +1723,7 @@ repository:
17231723
- include: '#type-parameters'
17241724
- include: '#type-tuple'
17251725
- include: '#type-object'
1726+
- include: '#type-conditional'
17261727
- include: '#type-operators'
17271728
- include: '#type-fn-type-parameters'
17281729
- include: '#type-paren-or-function-parameters'
@@ -1774,6 +1775,13 @@ repository:
17741775
- include: '#punctuation-semicolon'
17751776
- include: '#type'
17761777

1778+
#conditional type
1779+
type-conditional:
1780+
match: '{{startOfIdentifier}}({{identifier}})\s+(extends)\s+'
1781+
captures:
1782+
'1': { name: entity.name.type.ts }
1783+
'2': { name: storage.modifier.ts }
1784+
17771785
# Parenthesis can contain either types and function parameters
17781786
# (number | string) or (param: number, param2: string)
17791787
# and it can be nested, for example
@@ -1872,6 +1880,8 @@ repository:
18721880
end: (?=\S)
18731881
- name: keyword.operator.expression.keyof.ts
18741882
match: '{{startOfIdentifier}}keyof{{endOfIdentifier}}'
1883+
- name: keyword.operator.ternary.ts
1884+
match: (\?|\:)
18751885

18761886
type-predicate-operator:
18771887
name: keyword.operator.expression.is.ts

TypeScript.tmLanguage

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4897,6 +4897,10 @@
48974897
<key>include</key>
48984898
<string>#type-object</string>
48994899
</dict>
4900+
<dict>
4901+
<key>include</key>
4902+
<string>#type-conditional</string>
4903+
</dict>
49004904
<dict>
49014905
<key>include</key>
49024906
<string>#type-operators</string>
@@ -5054,6 +5058,24 @@
50545058
</dict>
50555059
</array>
50565060
</dict>
5061+
<key>type-conditional</key>
5062+
<dict>
5063+
<key>match</key>
5064+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))([_$[:alpha:]][_$[:alnum:]]*)\s+(extends)\s+</string>
5065+
<key>captures</key>
5066+
<dict>
5067+
<key>1</key>
5068+
<dict>
5069+
<key>name</key>
5070+
<string>entity.name.type.ts</string>
5071+
</dict>
5072+
<key>2</key>
5073+
<dict>
5074+
<key>name</key>
5075+
<string>storage.modifier.ts</string>
5076+
</dict>
5077+
</dict>
5078+
</dict>
50575079
<key>type-paren-or-function-parameters</key>
50585080
<dict>
50595081
<key>name</key>
@@ -5291,6 +5313,12 @@
52915313
<key>match</key>
52925314
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))keyof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
52935315
</dict>
5316+
<dict>
5317+
<key>name</key>
5318+
<string>keyword.operator.ternary.ts</string>
5319+
<key>match</key>
5320+
<string>(\?|\:)</string>
5321+
</dict>
52945322
</array>
52955323
</dict>
52965324
<key>type-predicate-operator</key>

TypeScriptReact.tmLanguage

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4843,6 +4843,10 @@
48434843
<key>include</key>
48444844
<string>#type-object</string>
48454845
</dict>
4846+
<dict>
4847+
<key>include</key>
4848+
<string>#type-conditional</string>
4849+
</dict>
48464850
<dict>
48474851
<key>include</key>
48484852
<string>#type-operators</string>
@@ -5000,6 +5004,24 @@
50005004
</dict>
50015005
</array>
50025006
</dict>
5007+
<key>type-conditional</key>
5008+
<dict>
5009+
<key>match</key>
5010+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))([_$[:alpha:]][_$[:alnum:]]*)\s+(extends)\s+</string>
5011+
<key>captures</key>
5012+
<dict>
5013+
<key>1</key>
5014+
<dict>
5015+
<key>name</key>
5016+
<string>entity.name.type.tsx</string>
5017+
</dict>
5018+
<key>2</key>
5019+
<dict>
5020+
<key>name</key>
5021+
<string>storage.modifier.tsx</string>
5022+
</dict>
5023+
</dict>
5024+
</dict>
50035025
<key>type-paren-or-function-parameters</key>
50045026
<dict>
50055027
<key>name</key>
@@ -5237,6 +5259,12 @@
52375259
<key>match</key>
52385260
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))keyof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
52395261
</dict>
5262+
<dict>
5263+
<key>name</key>
5264+
<string>keyword.operator.ternary.tsx</string>
5265+
<key>match</key>
5266+
<string>(\?|\:)</string>
5267+
</dict>
52405268
</array>
52415269
</dict>
52425270
<key>type-predicate-operator</key>
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
original file
2+
-----------------------------------
3+
type Diff1<T, U> = T extends U ? never : T
4+
type TypeName<T> =
5+
T extends string ? "string" :
6+
T extends number ? "number" :
7+
T extends boolean ? "boolean" :
8+
T extends undefined ? "undefined" :
9+
T extends Function ? "function" :
10+
"object";
11+
-----------------------------------
12+
13+
Grammar: TypeScript.tmLanguage
14+
-----------------------------------
15+
>type Diff1<T, U> = T extends U ? never : T
16+
^^^^
17+
source.ts meta.type.declaration.ts storage.type.type.ts
18+
^
19+
source.ts meta.type.declaration.ts
20+
^^^^^
21+
source.ts meta.type.declaration.ts entity.name.type.alias.ts
22+
^
23+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
24+
^
25+
source.ts meta.type.declaration.ts meta.type.parameters.ts entity.name.type.ts
26+
^
27+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.separator.comma.ts
28+
^
29+
source.ts meta.type.declaration.ts meta.type.parameters.ts
30+
^
31+
source.ts meta.type.declaration.ts meta.type.parameters.ts entity.name.type.ts
32+
^
33+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
34+
^
35+
source.ts meta.type.declaration.ts
36+
^
37+
source.ts meta.type.declaration.ts keyword.operator.assignment.ts
38+
^
39+
source.ts meta.type.declaration.ts
40+
^
41+
source.ts meta.type.declaration.ts entity.name.type.ts
42+
^
43+
source.ts meta.type.declaration.ts
44+
^^^^^^^
45+
source.ts meta.type.declaration.ts storage.modifier.ts
46+
^
47+
source.ts meta.type.declaration.ts
48+
^
49+
source.ts meta.type.declaration.ts entity.name.type.ts
50+
^
51+
source.ts meta.type.declaration.ts
52+
^
53+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
54+
^
55+
source.ts meta.type.declaration.ts
56+
^^^^^
57+
source.ts meta.type.declaration.ts support.type.primitive.ts
58+
^
59+
source.ts meta.type.declaration.ts
60+
^
61+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
62+
^
63+
source.ts meta.type.declaration.ts
64+
^
65+
source.ts meta.type.declaration.ts entity.name.type.ts
66+
^^
67+
source.ts meta.type.declaration.ts
68+
>type TypeName<T> =
69+
^^^^
70+
source.ts meta.type.declaration.ts storage.type.type.ts
71+
^
72+
source.ts meta.type.declaration.ts
73+
^^^^^^^^
74+
source.ts meta.type.declaration.ts entity.name.type.alias.ts
75+
^
76+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
77+
^
78+
source.ts meta.type.declaration.ts meta.type.parameters.ts entity.name.type.ts
79+
^
80+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
81+
^
82+
source.ts meta.type.declaration.ts
83+
^
84+
source.ts meta.type.declaration.ts keyword.operator.assignment.ts
85+
^^
86+
source.ts meta.type.declaration.ts
87+
> T extends string ? "string" :
88+
^^^^
89+
source.ts meta.type.declaration.ts
90+
^
91+
source.ts meta.type.declaration.ts entity.name.type.ts
92+
^
93+
source.ts meta.type.declaration.ts
94+
^^^^^^^
95+
source.ts meta.type.declaration.ts storage.modifier.ts
96+
^
97+
source.ts meta.type.declaration.ts
98+
^^^^^^
99+
source.ts meta.type.declaration.ts support.type.primitive.ts
100+
^
101+
source.ts meta.type.declaration.ts
102+
^
103+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
104+
^
105+
source.ts meta.type.declaration.ts
106+
^
107+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.begin.ts
108+
^^^^^^
109+
source.ts meta.type.declaration.ts string.quoted.double.ts
110+
^
111+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.end.ts
112+
^
113+
source.ts meta.type.declaration.ts
114+
^
115+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
116+
^^
117+
source.ts meta.type.declaration.ts
118+
> T extends number ? "number" :
119+
^^^^^^^^
120+
source.ts meta.type.declaration.ts
121+
^
122+
source.ts meta.type.declaration.ts entity.name.type.ts
123+
^
124+
source.ts meta.type.declaration.ts
125+
^^^^^^^
126+
source.ts meta.type.declaration.ts storage.modifier.ts
127+
^
128+
source.ts meta.type.declaration.ts
129+
^^^^^^
130+
source.ts meta.type.declaration.ts support.type.primitive.ts
131+
^
132+
source.ts meta.type.declaration.ts
133+
^
134+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
135+
^
136+
source.ts meta.type.declaration.ts
137+
^
138+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.begin.ts
139+
^^^^^^
140+
source.ts meta.type.declaration.ts string.quoted.double.ts
141+
^
142+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.end.ts
143+
^
144+
source.ts meta.type.declaration.ts
145+
^
146+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
147+
^^
148+
source.ts meta.type.declaration.ts
149+
> T extends boolean ? "boolean" :
150+
^^^^^^^^^^^^
151+
source.ts meta.type.declaration.ts
152+
^
153+
source.ts meta.type.declaration.ts entity.name.type.ts
154+
^
155+
source.ts meta.type.declaration.ts
156+
^^^^^^^
157+
source.ts meta.type.declaration.ts storage.modifier.ts
158+
^
159+
source.ts meta.type.declaration.ts
160+
^^^^^^^
161+
source.ts meta.type.declaration.ts support.type.primitive.ts
162+
^
163+
source.ts meta.type.declaration.ts
164+
^
165+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
166+
^
167+
source.ts meta.type.declaration.ts
168+
^
169+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.begin.ts
170+
^^^^^^^
171+
source.ts meta.type.declaration.ts string.quoted.double.ts
172+
^
173+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.end.ts
174+
^
175+
source.ts meta.type.declaration.ts
176+
^
177+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
178+
^^
179+
source.ts meta.type.declaration.ts
180+
> T extends undefined ? "undefined" :
181+
^^^^^^^^^^^^^^^^
182+
source.ts meta.type.declaration.ts
183+
^
184+
source.ts meta.type.declaration.ts entity.name.type.ts
185+
^
186+
source.ts meta.type.declaration.ts
187+
^^^^^^^
188+
source.ts meta.type.declaration.ts storage.modifier.ts
189+
^
190+
source.ts meta.type.declaration.ts
191+
^^^^^^^^^
192+
source.ts meta.type.declaration.ts support.type.builtin.ts
193+
^
194+
source.ts meta.type.declaration.ts
195+
^
196+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
197+
^
198+
source.ts meta.type.declaration.ts
199+
^
200+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.begin.ts
201+
^^^^^^^^^
202+
source.ts meta.type.declaration.ts string.quoted.double.ts
203+
^
204+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.end.ts
205+
^
206+
source.ts meta.type.declaration.ts
207+
^
208+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
209+
^^
210+
source.ts meta.type.declaration.ts
211+
> T extends Function ? "function" :
212+
^^^^^^^^^^^^^^^^^^^^
213+
source.ts meta.type.declaration.ts
214+
^
215+
source.ts meta.type.declaration.ts entity.name.type.ts
216+
^
217+
source.ts meta.type.declaration.ts
218+
^^^^^^^
219+
source.ts meta.type.declaration.ts storage.modifier.ts
220+
^
221+
source.ts meta.type.declaration.ts
222+
^^^^^^^^
223+
source.ts meta.type.declaration.ts entity.name.type.ts
224+
^
225+
source.ts meta.type.declaration.ts
226+
^
227+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
228+
^
229+
source.ts meta.type.declaration.ts
230+
^
231+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.begin.ts
232+
^^^^^^^^
233+
source.ts meta.type.declaration.ts string.quoted.double.ts
234+
^
235+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.end.ts
236+
^
237+
source.ts meta.type.declaration.ts
238+
^
239+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
240+
^^
241+
source.ts meta.type.declaration.ts
242+
> "object";
243+
^^^^^^^^^^^^^^^^^^^^^^^^
244+
source.ts meta.type.declaration.ts
245+
^
246+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.begin.ts
247+
^^^^^^
248+
source.ts meta.type.declaration.ts string.quoted.double.ts
249+
^
250+
source.ts meta.type.declaration.ts string.quoted.double.ts punctuation.definition.string.end.ts
251+
^
252+
source.ts punctuation.terminator.statement.ts

tests/cases/conditionalTypes.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
type Diff1<T, U> = T extends U ? never : T
2+
type TypeName<T> =
3+
T extends string ? "string" :
4+
T extends number ? "number" :
5+
T extends boolean ? "boolean" :
6+
T extends undefined ? "undefined" :
7+
T extends Function ? "function" :
8+
"object";

0 commit comments

Comments
 (0)