Skip to content

Commit ccdddf5

Browse files
ilyaliaoso1ve
andauthored
fix: handle optional properties (#79)
Co-authored-by: so1ve <i@mk1.io>
1 parent 324bfe8 commit ccdddf5

File tree

3 files changed

+371
-371
lines changed

3 files changed

+371
-371
lines changed

packages/complex-types/src/core/printer.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,12 @@ export class Printer {
6060
const type = this.checker.getTypeAtLocation(node);
6161
const properties = type.getProperties();
6262
const parts = ["{"];
63-
let questionToken = "";
64-
if (ts.isMappedTypeNode(node)) {
65-
questionToken = node.questionToken?.getText() ?? "";
66-
}
63+
const isMapped = ts.isMappedTypeNode(node);
6764
for (const property of properties) {
65+
const questionToken = isMapped
66+
? node.questionToken?.getText() ?? ""
67+
: (property.flags & ts.SymbolFlags.Optional ? "?" : "");
68+
6869
const valueType = this.checker.getTypeOfSymbol(property);
6970
const stringValueType = this.checker.typeToString(
7071
this.getBaseType(valueType),
@@ -77,7 +78,6 @@ export class Printer {
7778
)}${questionToken}: ${stringValueType}`,
7879
);
7980
}
80-
8181
parts.push("}");
8282

8383
return parts.join("\n");

packages/complex-types/test/__snapshots__/fixtures-compiled.test.ts.snap

Lines changed: 183 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -158,189 +158,189 @@ import _export_sfc from '[NULL]/plugin-vue/export-helper';
158158
var _sfc_main = /* @__PURE__ */ defineComponent({
159159
__name: "core#8286",
160160
props: {
161-
autofocus: { required: true },
162-
disabled: { required: true },
163-
form: { required: true },
164-
formaction: { required: true },
165-
formenctype: { required: true },
166-
formmethod: { required: true },
167-
formnovalidate: { required: true },
168-
formtarget: { required: true },
169-
name: { required: true },
170-
type: { required: true },
171-
value: { required: true },
172-
innerHTML: { required: true },
173-
class: { required: true },
174-
style: { required: true },
175-
accesskey: { required: true },
176-
contenteditable: { required: true },
177-
contextmenu: { required: true },
178-
dir: { required: true },
179-
draggable: { required: true },
180-
hidden: { required: true },
181-
id: { required: true },
182-
inert: { required: true },
183-
lang: { required: true },
184-
placeholder: { required: true },
185-
spellcheck: { required: true },
186-
tabindex: { required: true },
187-
title: { required: true },
188-
translate: { required: true },
189-
radiogroup: { required: true },
190-
role: { required: true },
191-
about: { required: true },
192-
datatype: { required: true },
193-
inlist: { required: true },
194-
prefix: { required: true },
195-
property: { required: true },
196-
resource: { required: true },
197-
typeof: { required: true },
198-
vocab: { required: true },
199-
autocapitalize: { required: true },
200-
autocorrect: { required: true },
201-
autosave: { required: true },
202-
color: { required: true },
203-
itemprop: { required: true },
204-
itemscope: { required: true },
205-
itemtype: { required: true },
206-
itemid: { required: true },
207-
itemref: { required: true },
208-
results: { required: true },
209-
security: { required: true },
210-
unselectable: { required: true },
211-
inputmode: { required: true },
212-
is: { required: true },
213-
"aria-activedescendant": { required: true },
214-
"aria-atomic": { required: true },
215-
"aria-autocomplete": { required: true },
216-
"aria-busy": { required: true },
217-
"aria-checked": { required: true },
218-
"aria-colcount": { required: true },
219-
"aria-colindex": { required: true },
220-
"aria-colspan": { required: true },
221-
"aria-controls": { required: true },
222-
"aria-current": { required: true },
223-
"aria-describedby": { required: true },
224-
"aria-details": { required: true },
225-
"aria-disabled": { required: true },
226-
"aria-dropeffect": { required: true },
227-
"aria-errormessage": { required: true },
228-
"aria-expanded": { required: true },
229-
"aria-flowto": { required: true },
230-
"aria-grabbed": { required: true },
231-
"aria-haspopup": { required: true },
232-
"aria-hidden": { required: true },
233-
"aria-invalid": { required: true },
234-
"aria-keyshortcuts": { required: true },
235-
"aria-label": { required: true },
236-
"aria-labelledby": { required: true },
237-
"aria-level": { required: true },
238-
"aria-live": { required: true },
239-
"aria-modal": { required: true },
240-
"aria-multiline": { required: true },
241-
"aria-multiselectable": { required: true },
242-
"aria-orientation": { required: true },
243-
"aria-owns": { required: true },
244-
"aria-placeholder": { required: true },
245-
"aria-posinset": { required: true },
246-
"aria-pressed": { required: true },
247-
"aria-readonly": { required: true },
248-
"aria-relevant": { required: true },
249-
"aria-required": { required: true },
250-
"aria-roledescription": { required: true },
251-
"aria-rowcount": { required: true },
252-
"aria-rowindex": { required: true },
253-
"aria-rowspan": { required: true },
254-
"aria-selected": { required: true },
255-
"aria-setsize": { required: true },
256-
"aria-sort": { required: true },
257-
"aria-valuemax": { required: true },
258-
"aria-valuemin": { required: true },
259-
"aria-valuenow": { required: true },
260-
"aria-valuetext": { required: true },
261-
onCopy: { required: true },
262-
onCut: { required: true },
263-
onPaste: { required: true },
264-
onCompositionend: { required: true },
265-
onCompositionstart: { required: true },
266-
onCompositionupdate: { required: true },
267-
onDrag: { required: true },
268-
onDragend: { required: true },
269-
onDragenter: { required: true },
270-
onDragexit: { required: true },
271-
onDragleave: { required: true },
272-
onDragover: { required: true },
273-
onDragstart: { required: true },
274-
onDrop: { required: true },
275-
onFocus: { required: true },
276-
onFocusin: { required: true },
277-
onFocusout: { required: true },
278-
onBlur: { required: true },
279-
onChange: { required: true },
280-
onBeforeinput: { required: true },
281-
onInput: { required: true },
282-
onReset: { required: true },
283-
onSubmit: { required: true },
284-
onInvalid: { required: true },
285-
onLoad: { required: true },
286-
onError: { required: true },
287-
onKeydown: { required: true },
288-
onKeypress: { required: true },
289-
onKeyup: { required: true },
290-
onAuxclick: { required: true },
291-
onClick: { required: true },
292-
onContextmenu: { required: true },
293-
onDblclick: { required: true },
294-
onMousedown: { required: true },
295-
onMouseenter: { required: true },
296-
onMouseleave: { required: true },
297-
onMousemove: { required: true },
298-
onMouseout: { required: true },
299-
onMouseover: { required: true },
300-
onMouseup: { required: true },
301-
onAbort: { required: true },
302-
onCanplay: { required: true },
303-
onCanplaythrough: { required: true },
304-
onDurationchange: { required: true },
305-
onEmptied: { required: true },
306-
onEncrypted: { required: true },
307-
onEnded: { required: true },
308-
onLoadeddata: { required: true },
309-
onLoadedmetadata: { required: true },
310-
onLoadstart: { required: true },
311-
onPause: { required: true },
312-
onPlay: { required: true },
313-
onPlaying: { required: true },
314-
onProgress: { required: true },
315-
onRatechange: { required: true },
316-
onSeeked: { required: true },
317-
onSeeking: { required: true },
318-
onStalled: { required: true },
319-
onSuspend: { required: true },
320-
onTimeupdate: { required: true },
321-
onVolumechange: { required: true },
322-
onWaiting: { required: true },
323-
onSelect: { required: true },
324-
onScroll: { required: true },
325-
onScrollend: { required: true },
326-
onTouchcancel: { required: true },
327-
onTouchend: { required: true },
328-
onTouchmove: { required: true },
329-
onTouchstart: { required: true },
330-
onPointerdown: { required: true },
331-
onPointermove: { required: true },
332-
onPointerup: { required: true },
333-
onPointercancel: { required: true },
334-
onPointerenter: { required: true },
335-
onPointerleave: { required: true },
336-
onPointerover: { required: true },
337-
onPointerout: { required: true },
338-
onWheel: { required: true },
339-
onAnimationstart: { required: true },
340-
onAnimationend: { required: true },
341-
onAnimationiteration: { required: true },
342-
onTransitionend: { required: true },
343-
onTransitionstart: { required: true }
161+
autofocus: { required: false },
162+
disabled: { required: false },
163+
form: { required: false },
164+
formaction: { required: false },
165+
formenctype: { required: false },
166+
formmethod: { required: false },
167+
formnovalidate: { required: false },
168+
formtarget: { required: false },
169+
name: { required: false },
170+
type: { required: false },
171+
value: { required: false },
172+
innerHTML: { required: false },
173+
class: { required: false },
174+
style: { required: false },
175+
accesskey: { required: false },
176+
contenteditable: { required: false },
177+
contextmenu: { required: false },
178+
dir: { required: false },
179+
draggable: { required: false },
180+
hidden: { required: false },
181+
id: { required: false },
182+
inert: { required: false },
183+
lang: { required: false },
184+
placeholder: { required: false },
185+
spellcheck: { required: false },
186+
tabindex: { required: false },
187+
title: { required: false },
188+
translate: { required: false },
189+
radiogroup: { required: false },
190+
role: { required: false },
191+
about: { required: false },
192+
datatype: { required: false },
193+
inlist: { required: false },
194+
prefix: { required: false },
195+
property: { required: false },
196+
resource: { required: false },
197+
typeof: { required: false },
198+
vocab: { required: false },
199+
autocapitalize: { required: false },
200+
autocorrect: { required: false },
201+
autosave: { required: false },
202+
color: { required: false },
203+
itemprop: { required: false },
204+
itemscope: { required: false },
205+
itemtype: { required: false },
206+
itemid: { required: false },
207+
itemref: { required: false },
208+
results: { required: false },
209+
security: { required: false },
210+
unselectable: { required: false },
211+
inputmode: { required: false },
212+
is: { required: false },
213+
"aria-activedescendant": { required: false },
214+
"aria-atomic": { required: false },
215+
"aria-autocomplete": { required: false },
216+
"aria-busy": { required: false },
217+
"aria-checked": { required: false },
218+
"aria-colcount": { required: false },
219+
"aria-colindex": { required: false },
220+
"aria-colspan": { required: false },
221+
"aria-controls": { required: false },
222+
"aria-current": { required: false },
223+
"aria-describedby": { required: false },
224+
"aria-details": { required: false },
225+
"aria-disabled": { required: false },
226+
"aria-dropeffect": { required: false },
227+
"aria-errormessage": { required: false },
228+
"aria-expanded": { required: false },
229+
"aria-flowto": { required: false },
230+
"aria-grabbed": { required: false },
231+
"aria-haspopup": { required: false },
232+
"aria-hidden": { required: false },
233+
"aria-invalid": { required: false },
234+
"aria-keyshortcuts": { required: false },
235+
"aria-label": { required: false },
236+
"aria-labelledby": { required: false },
237+
"aria-level": { required: false },
238+
"aria-live": { required: false },
239+
"aria-modal": { required: false },
240+
"aria-multiline": { required: false },
241+
"aria-multiselectable": { required: false },
242+
"aria-orientation": { required: false },
243+
"aria-owns": { required: false },
244+
"aria-placeholder": { required: false },
245+
"aria-posinset": { required: false },
246+
"aria-pressed": { required: false },
247+
"aria-readonly": { required: false },
248+
"aria-relevant": { required: false },
249+
"aria-required": { required: false },
250+
"aria-roledescription": { required: false },
251+
"aria-rowcount": { required: false },
252+
"aria-rowindex": { required: false },
253+
"aria-rowspan": { required: false },
254+
"aria-selected": { required: false },
255+
"aria-setsize": { required: false },
256+
"aria-sort": { required: false },
257+
"aria-valuemax": { required: false },
258+
"aria-valuemin": { required: false },
259+
"aria-valuenow": { required: false },
260+
"aria-valuetext": { required: false },
261+
onCopy: { required: false },
262+
onCut: { required: false },
263+
onPaste: { required: false },
264+
onCompositionend: { required: false },
265+
onCompositionstart: { required: false },
266+
onCompositionupdate: { required: false },
267+
onDrag: { required: false },
268+
onDragend: { required: false },
269+
onDragenter: { required: false },
270+
onDragexit: { required: false },
271+
onDragleave: { required: false },
272+
onDragover: { required: false },
273+
onDragstart: { required: false },
274+
onDrop: { required: false },
275+
onFocus: { required: false },
276+
onFocusin: { required: false },
277+
onFocusout: { required: false },
278+
onBlur: { required: false },
279+
onChange: { required: false },
280+
onBeforeinput: { required: false },
281+
onInput: { required: false },
282+
onReset: { required: false },
283+
onSubmit: { required: false },
284+
onInvalid: { required: false },
285+
onLoad: { required: false },
286+
onError: { required: false },
287+
onKeydown: { required: false },
288+
onKeypress: { required: false },
289+
onKeyup: { required: false },
290+
onAuxclick: { required: false },
291+
onClick: { required: false },
292+
onContextmenu: { required: false },
293+
onDblclick: { required: false },
294+
onMousedown: { required: false },
295+
onMouseenter: { required: false },
296+
onMouseleave: { required: false },
297+
onMousemove: { required: false },
298+
onMouseout: { required: false },
299+
onMouseover: { required: false },
300+
onMouseup: { required: false },
301+
onAbort: { required: false },
302+
onCanplay: { required: false },
303+
onCanplaythrough: { required: false },
304+
onDurationchange: { required: false },
305+
onEmptied: { required: false },
306+
onEncrypted: { required: false },
307+
onEnded: { required: false },
308+
onLoadeddata: { required: false },
309+
onLoadedmetadata: { required: false },
310+
onLoadstart: { required: false },
311+
onPause: { required: false },
312+
onPlay: { required: false },
313+
onPlaying: { required: false },
314+
onProgress: { required: false },
315+
onRatechange: { required: false },
316+
onSeeked: { required: false },
317+
onSeeking: { required: false },
318+
onStalled: { required: false },
319+
onSuspend: { required: false },
320+
onTimeupdate: { required: false },
321+
onVolumechange: { required: false },
322+
onWaiting: { required: false },
323+
onSelect: { required: false },
324+
onScroll: { required: false },
325+
onScrollend: { required: false },
326+
onTouchcancel: { required: false },
327+
onTouchend: { required: false },
328+
onTouchmove: { required: false },
329+
onTouchstart: { required: false },
330+
onPointerdown: { required: false },
331+
onPointermove: { required: false },
332+
onPointerup: { required: false },
333+
onPointercancel: { required: false },
334+
onPointerenter: { required: false },
335+
onPointerleave: { required: false },
336+
onPointerover: { required: false },
337+
onPointerout: { required: false },
338+
onWheel: { required: false },
339+
onAnimationstart: { required: false },
340+
onAnimationend: { required: false },
341+
onAnimationiteration: { required: false },
342+
onTransitionend: { required: false },
343+
onTransitionstart: { required: false }
344344
},
345345
setup(__props, { expose: __expose }) {
346346
__expose();

0 commit comments

Comments
 (0)