Skip to content

Commit

Permalink
fix(jsii): Optional any represented as required (#237)
Browse files Browse the repository at this point in the history
* fix(jsii): Optional `any` represented as required

Optional parameters and properties typed `any` would be represented as
required, despite the code unambiguously suggests the opposite. This is
due to the fact that `any` implicitly covers `null` and `undefined`.
This change fixes this by adding a specific provision for the question
mark token in the declarations of those, and adds compliance test
coverage for the same.

Fixes #230

* Mark all `any` types as `optional`.
RomainMuller authored Sep 19, 2018
1 parent 578bf9c commit 91074f3
Showing 20 changed files with 215 additions and 64 deletions.
3 changes: 2 additions & 1 deletion packages/jsii-calc-base/test/assembly.jsii
Original file line number Diff line number Diff line change
@@ -72,6 +72,7 @@
},
"name": "typeName",
"returns": {
"optional": true,
"primitive": "any"
}
}
@@ -101,5 +102,5 @@
}
},
"version": "0.7.5",
"fingerprint": "Kzm7bNzxYO6frB7BwjqVBKhzTiCRwVG5aqgQrz7MOnE="
"fingerprint": "kazFxdH9DydCwjHvToTbXzqqXE0CytJ5qNmGO1NlGAM="
}
5 changes: 5 additions & 0 deletions packages/jsii-calc/lib/compliance.ts
Original file line number Diff line number Diff line change
@@ -244,6 +244,10 @@ export class RuntimeTypeChecking {
public methodWithDefaultedArguments(arg1: number = 2, arg2: string, arg3: Date = new Date()) {
arg1; arg2; arg3;
}

public methodWithOptionalAnyArgument(arg?: any) {
arg;
}
}

export class OptionalConstructorArgument {
@@ -479,6 +483,7 @@ export interface DerivedStruct extends MyFirstStruct {
bool: boolean
anotherRequired: Date
optionalArray?: string[]
optionalAny?: any
/**
* This is optional.
*/
43 changes: 35 additions & 8 deletions packages/jsii-calc/test/assembly.jsii
Original file line number Diff line number Diff line change
@@ -377,6 +377,7 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "array"
@@ -388,18 +389,13 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "map"
}
}
},
{
"name": "anyProperty",
"type": {
"primitive": "any"
}
},
{
"name": "arrayProperty",
"type": {
@@ -521,6 +517,7 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "array"
@@ -532,15 +529,17 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "map"
}
}
},
{
"name": "unknownProperty",
"name": "anyProperty",
"type": {
"optional": true,
"primitive": "any"
}
},
@@ -550,6 +549,13 @@
"fqn": "jsii-calc.StringEnum",
"optional": true
}
},
{
"name": "unknownProperty",
"type": {
"optional": true,
"primitive": "any"
}
}
]
},
@@ -1152,6 +1158,14 @@
"optional": true
}
},
{
"abstract": true,
"name": "optionalAny",
"type": {
"optional": true,
"primitive": "any"
}
},
{
"abstract": true,
"name": "optionalArray",
@@ -2403,6 +2417,18 @@
}
]
},
{
"name": "methodWithOptionalAnyArgument",
"parameters": [
{
"name": "arg",
"type": {
"optional": true,
"primitive": "any"
}
}
]
},
{
"docs": {
"comment": "Used to verify verification of number of method arguments."
@@ -2854,6 +2880,7 @@
{
"name": "value",
"returns": {
"optional": true,
"primitive": "any"
}
}
@@ -3203,5 +3230,5 @@
}
},
"version": "0.7.5",
"fingerprint": "PrLv57d+5ukv/bps1DvjB9DpM5DS6TpCEld13gQUTe8="
"fingerprint": "Zt3ElcP9k7ABYhwmP1xNZBni1sFj9iw0FZwWOe8n+L8="
}
Original file line number Diff line number Diff line change
@@ -72,6 +72,7 @@
},
"name": "typeName",
"returns": {
"optional": true,
"primitive": "any"
}
}
@@ -101,5 +102,5 @@
}
},
"version": "0.7.5",
"fingerprint": "Kzm7bNzxYO6frB7BwjqVBKhzTiCRwVG5aqgQrz7MOnE="
"fingerprint": "kazFxdH9DydCwjHvToTbXzqqXE0CytJ5qNmGO1NlGAM="
}
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@ protected Base(DeputyProps props): base(props)
}

/// <returns>the name of the class (to verify native type names are created for derived classes).</returns>
[JsiiMethod("typeName", "{\"primitive\":\"any\"}", "[]")]
[JsiiMethod("typeName", "{\"primitive\":\"any\",\"optional\":true}", "[]")]
public virtual object TypeName()
{
return InvokeInstanceMethod<object>(new object[]{});
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@ protected Base(final software.amazon.jsii.JsiiObject.InitializationMode mode) {
/**
* @return the name of the class (to verify native type names are created for derived classes).
*/
@javax.annotation.Nullable
public java.lang.Object typeName() {
return this.jsiiCall("typeName", java.lang.Object.class);
}
Original file line number Diff line number Diff line change
@@ -158,7 +158,7 @@ Base
.. py:method:: typeName() -> any
:return: the name of the class (to verify native type names are created for derived classes).
:rtype: any
:rtype: any or undefined


BaseProps (interface)
Original file line number Diff line number Diff line change
@@ -377,6 +377,7 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "array"
@@ -388,18 +389,13 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "map"
}
}
},
{
"name": "anyProperty",
"type": {
"primitive": "any"
}
},
{
"name": "arrayProperty",
"type": {
@@ -521,6 +517,7 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "array"
@@ -532,15 +529,17 @@
"type": {
"collection": {
"elementtype": {
"optional": true,
"primitive": "any"
},
"kind": "map"
}
}
},
{
"name": "unknownProperty",
"name": "anyProperty",
"type": {
"optional": true,
"primitive": "any"
}
},
@@ -550,6 +549,13 @@
"fqn": "jsii-calc.StringEnum",
"optional": true
}
},
{
"name": "unknownProperty",
"type": {
"optional": true,
"primitive": "any"
}
}
]
},
@@ -1152,6 +1158,14 @@
"optional": true
}
},
{
"abstract": true,
"name": "optionalAny",
"type": {
"optional": true,
"primitive": "any"
}
},
{
"abstract": true,
"name": "optionalArray",
@@ -2403,6 +2417,18 @@
}
]
},
{
"name": "methodWithOptionalAnyArgument",
"parameters": [
{
"name": "arg",
"type": {
"optional": true,
"primitive": "any"
}
}
]
},
{
"docs": {
"comment": "Used to verify verification of number of method arguments."
@@ -2854,6 +2880,7 @@
{
"name": "value",
"returns": {
"optional": true,
"primitive": "any"
}
}
@@ -3203,5 +3230,5 @@
}
},
"version": "0.7.5",
"fingerprint": "PrLv57d+5ukv/bps1DvjB9DpM5DS6TpCEld13gQUTe8="
"fingerprint": "Zt3ElcP9k7ABYhwmP1xNZBni1sFj9iw0FZwWOe8n+L8="
}
Original file line number Diff line number Diff line change
@@ -31,27 +31,20 @@ public virtual double EnumPropertyValue
get => GetInstanceProperty<double>();
}

[JsiiProperty("anyArrayProperty", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\"}}}")]
[JsiiProperty("anyArrayProperty", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\",\"optional\":true}}}")]
public virtual object[] AnyArrayProperty
{
get => GetInstanceProperty<object[]>();
set => SetInstanceProperty(value);
}

[JsiiProperty("anyMapProperty", "{\"collection\":{\"kind\":\"map\",\"elementtype\":{\"primitive\":\"any\"}}}")]
[JsiiProperty("anyMapProperty", "{\"collection\":{\"kind\":\"map\",\"elementtype\":{\"primitive\":\"any\",\"optional\":true}}}")]
public virtual IDictionary<string, object> AnyMapProperty
{
get => GetInstanceProperty<IDictionary<string, object>>();
set => SetInstanceProperty(value);
}

[JsiiProperty("anyProperty", "{\"primitive\":\"any\"}")]
public virtual object AnyProperty
{
get => GetInstanceProperty<object>();
set => SetInstanceProperty(value);
}

[JsiiProperty("arrayProperty", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"string\"}}}")]
public virtual string[] ArrayProperty
{
@@ -129,22 +122,22 @@ public virtual object UnionProperty
set => SetInstanceProperty(value);
}

[JsiiProperty("unknownArrayProperty", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\"}}}")]
[JsiiProperty("unknownArrayProperty", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\",\"optional\":true}}}")]
public virtual object[] UnknownArrayProperty
{
get => GetInstanceProperty<object[]>();
set => SetInstanceProperty(value);
}

[JsiiProperty("unknownMapProperty", "{\"collection\":{\"kind\":\"map\",\"elementtype\":{\"primitive\":\"any\"}}}")]
[JsiiProperty("unknownMapProperty", "{\"collection\":{\"kind\":\"map\",\"elementtype\":{\"primitive\":\"any\",\"optional\":true}}}")]
public virtual IDictionary<string, object> UnknownMapProperty
{
get => GetInstanceProperty<IDictionary<string, object>>();
set => SetInstanceProperty(value);
}

[JsiiProperty("unknownProperty", "{\"primitive\":\"any\"}")]
public virtual object UnknownProperty
[JsiiProperty("anyProperty", "{\"primitive\":\"any\",\"optional\":true}")]
public virtual object AnyProperty
{
get => GetInstanceProperty<object>();
set => SetInstanceProperty(value);
@@ -157,6 +150,13 @@ public virtual StringEnum OptionalEnumValue
set => SetInstanceProperty(value);
}

[JsiiProperty("unknownProperty", "{\"primitive\":\"any\",\"optional\":true}")]
public virtual object UnknownProperty
{
get => GetInstanceProperty<object>();
set => SetInstanceProperty(value);
}

[JsiiMethod("enumMethod", "{\"fqn\":\"jsii-calc.StringEnum\"}", "[{\"name\":\"value\",\"type\":{\"fqn\":\"jsii-calc.StringEnum\"}}]")]
public virtual StringEnum EnumMethod(StringEnum value)
{
Original file line number Diff line number Diff line change
@@ -38,6 +38,13 @@ public IDictionary<string, Value_> AnotherOptional
set;
}

[JsiiProperty("optionalAny", "{\"primitive\":\"any\",\"optional\":true}", true)]
public object OptionalAny
{
get;
set;
}

[JsiiProperty("optionalArray", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"string\"}},\"optional\":true}", true)]
public string[] OptionalArray
{
Original file line number Diff line number Diff line change
@@ -43,6 +43,13 @@ public virtual IDictionary<string, Value_> AnotherOptional
set => SetInstanceProperty(value);
}

[JsiiProperty("optionalAny", "{\"primitive\":\"any\",\"optional\":true}")]
public virtual object OptionalAny
{
get => GetInstanceProperty<object>();
set => SetInstanceProperty(value);
}

[JsiiProperty("optionalArray", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"string\"}},\"optional\":true}")]
public virtual string[] OptionalArray
{
Original file line number Diff line number Diff line change
@@ -39,6 +39,13 @@ IDictionary<string, Value_> AnotherOptional
set;
}

[JsiiProperty("optionalAny", "{\"primitive\":\"any\",\"optional\":true}")]
object OptionalAny
{
get;
set;
}

[JsiiProperty("optionalArray", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"string\"}},\"optional\":true}")]
string[] OptionalArray
{
Original file line number Diff line number Diff line change
@@ -24,6 +24,12 @@ public virtual void MethodWithDefaultedArguments(double? arg1, string arg2, Date
InvokeInstanceVoidMethod(new object[]{arg1, arg2, arg3});
}

[JsiiMethod("methodWithOptionalAnyArgument", null, "[{\"name\":\"arg\",\"type\":{\"primitive\":\"any\",\"optional\":true}}]")]
public virtual void MethodWithOptionalAnyArgument(object arg)
{
InvokeInstanceVoidMethod(new object[]{arg});
}

/// <summary>Used to verify verification of number of method arguments.</summary>
[JsiiMethod("methodWithOptionalArguments", null, "[{\"name\":\"arg1\",\"type\":{\"primitive\":\"number\"}},{\"name\":\"arg2\",\"type\":{\"primitive\":\"string\"}},{\"name\":\"arg3\",\"type\":{\"primitive\":\"date\",\"optional\":true}}]")]
public virtual void MethodWithOptionalArguments(double arg1, string arg2, DateTime? arg3)
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@ protected UseBundledDependency(DeputyProps props): base(props)
{
}

[JsiiMethod("value", "{\"primitive\":\"any\"}", "[]")]
[JsiiMethod("value", "{\"primitive\":\"any\",\"optional\":true}", "[]")]
public virtual object Value()
{
return InvokeInstanceMethod<object>(new object[]{});
Original file line number Diff line number Diff line change
@@ -39,14 +39,6 @@ public void setAnyMapProperty(final java.util.Map<java.lang.String, java.lang.Ob
this.jsiiSet("anyMapProperty", java.util.Objects.requireNonNull(value, "anyMapProperty is required"));
}

public java.lang.Object getAnyProperty() {
return this.jsiiGet("anyProperty", java.lang.Object.class);
}

public void setAnyProperty(final java.lang.Object value) {
this.jsiiSet("anyProperty", java.util.Objects.requireNonNull(value, "anyProperty is required"));
}

public java.util.List<java.lang.String> getArrayProperty() {
return this.jsiiGet("arrayProperty", java.util.List.class);
}
@@ -159,12 +151,13 @@ public void setUnknownMapProperty(final java.util.Map<java.lang.String, java.lan
this.jsiiSet("unknownMapProperty", java.util.Objects.requireNonNull(value, "unknownMapProperty is required"));
}

public java.lang.Object getUnknownProperty() {
return this.jsiiGet("unknownProperty", java.lang.Object.class);
@javax.annotation.Nullable
public java.lang.Object getAnyProperty() {
return this.jsiiGet("anyProperty", java.lang.Object.class);
}

public void setUnknownProperty(final java.lang.Object value) {
this.jsiiSet("unknownProperty", java.util.Objects.requireNonNull(value, "unknownProperty is required"));
public void setAnyProperty(@javax.annotation.Nullable final java.lang.Object value) {
this.jsiiSet("anyProperty", value);
}

@javax.annotation.Nullable
@@ -175,4 +168,13 @@ public software.amazon.jsii.tests.calculator.StringEnum getOptionalEnumValue() {
public void setOptionalEnumValue(@javax.annotation.Nullable final software.amazon.jsii.tests.calculator.StringEnum value) {
this.jsiiSet("optionalEnumValue", value);
}

@javax.annotation.Nullable
public java.lang.Object getUnknownProperty() {
return this.jsiiGet("unknownProperty", java.lang.Object.class);
}

public void setUnknownProperty(@javax.annotation.Nullable final java.lang.Object value) {
this.jsiiSet("unknownProperty", value);
}
}
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@ public interface DerivedStruct extends software.amazon.jsii.JsiiSerializable, so
* This is optional.
*/
void setAnotherOptional(final java.util.Map<java.lang.String, software.amazon.jsii.tests.calculator.lib.Value> value);
java.lang.Object getOptionalAny();
void setOptionalAny(final java.lang.Object value);
java.util.List<java.lang.String> getOptionalArray();
void setOptionalArray(final java.util.List<java.lang.String> value);

@@ -45,6 +47,8 @@ final class Builder {
@javax.annotation.Nullable
private java.util.Map<java.lang.String, software.amazon.jsii.tests.calculator.lib.Value> _anotherOptional;
@javax.annotation.Nullable
private java.lang.Object _optionalAny;
@javax.annotation.Nullable
private java.util.List<java.lang.String> _optionalArray;
private java.lang.Number _anumber;
private java.lang.String _astring;
@@ -87,6 +91,15 @@ public Builder withAnotherOptional(@javax.annotation.Nullable final java.util.Ma
this._anotherOptional = value;
return this;
}
/**
* Sets the value of OptionalAny
* @param value the value to be set
* @return {@code this}
*/
public Builder withOptionalAny(@javax.annotation.Nullable final java.lang.Object value) {
this._optionalAny = value;
return this;
}
/**
* Sets the value of OptionalArray
* @param value the value to be set
@@ -137,6 +150,8 @@ public DerivedStruct build() {
@javax.annotation.Nullable
private java.util.Map<java.lang.String, software.amazon.jsii.tests.calculator.lib.Value> $anotherOptional = _anotherOptional;
@javax.annotation.Nullable
private java.lang.Object $optionalAny = _optionalAny;
@javax.annotation.Nullable
private java.util.List<java.lang.String> $optionalArray = _optionalArray;
private java.lang.Number $anumber = java.util.Objects.requireNonNull(_anumber, "anumber is required");
private java.lang.String $astring = java.util.Objects.requireNonNull(_astring, "astring is required");
@@ -183,6 +198,16 @@ public void setAnotherOptional(@javax.annotation.Nullable final java.util.Map<ja
this.$anotherOptional = value;
}

@Override
public java.lang.Object getOptionalAny() {
return this.$optionalAny;
}

@Override
public void setOptionalAny(@javax.annotation.Nullable final java.lang.Object value) {
this.$optionalAny = value;
}

@Override
public java.util.List<java.lang.String> getOptionalArray() {
return this.$optionalArray;
@@ -288,6 +313,17 @@ public void setAnotherOptional(@javax.annotation.Nullable final java.util.Map<ja
this.jsiiSet("anotherOptional", value);
}

@Override
@javax.annotation.Nullable
public java.lang.Object getOptionalAny() {
return this.jsiiGet("optionalAny", java.lang.Object.class);
}

@Override
public void setOptionalAny(@javax.annotation.Nullable final java.lang.Object value) {
this.jsiiSet("optionalAny", value);
}

@Override
@javax.annotation.Nullable
public java.util.List<java.lang.String> getOptionalArray() {
Original file line number Diff line number Diff line change
@@ -19,6 +19,14 @@ public void methodWithDefaultedArguments(@javax.annotation.Nullable final java.l
this.jsiiCall("methodWithDefaultedArguments", Void.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(arg1), java.util.stream.Stream.of(java.util.Objects.requireNonNull(arg2, "arg2 is required"))).toArray());
}

public void methodWithOptionalAnyArgument(@javax.annotation.Nullable final java.lang.Object arg) {
this.jsiiCall("methodWithOptionalAnyArgument", Void.class, java.util.stream.Stream.of(arg).toArray());
}

public void methodWithOptionalAnyArgument() {
this.jsiiCall("methodWithOptionalAnyArgument", Void.class);
}

/**
* Used to verify verification of number of method arguments.
*/
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ public UseBundledDependency() {
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this);
}

@javax.annotation.Nullable
public java.lang.Object value() {
return this.jsiiCall("value", java.lang.Object.class);
}
35 changes: 23 additions & 12 deletions packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst
Original file line number Diff line number Diff line change
@@ -348,17 +348,12 @@ AllTypes

.. py:attribute:: anyArrayProperty
:type: any[]
:type: (any or undefined)[]


.. py:attribute:: anyMapProperty
:type: string => any


.. py:attribute:: anyProperty
:type: any
:type: string => (any or undefined)


.. py:attribute:: arrayProperty
@@ -418,24 +413,29 @@ AllTypes

.. py:attribute:: unknownArrayProperty
:type: any[]
:type: (any or undefined)[]


.. py:attribute:: unknownMapProperty
:type: string => any
:type: string => (any or undefined)


.. py:attribute:: unknownProperty
.. py:attribute:: anyProperty
:type: any
:type: any or undefined


.. py:attribute:: optionalEnumValue
:type: :py:class:`~jsii-calc.StringEnum`\ or undefined


.. py:attribute:: unknownProperty
:type: any or undefined


AllTypesEnum (enum)
^^^^^^^^^^^^^^^^^^^

@@ -1009,6 +1009,11 @@ DerivedStruct (interface)
:type: string => :py:class:`@scope/jsii-calc-lib.Value`\ or undefined *(abstract)*


.. py:attribute:: optionalAny
:type: any or undefined *(abstract)*


.. py:attribute:: optionalArray
:type: string[] or undefined *(abstract)*
@@ -2525,6 +2530,12 @@ RuntimeTypeChecking
:type arg3: date or undefined
.. py:method:: methodWithOptionalAnyArgument([arg])
:param arg:
:type arg: any or undefined
.. py:method:: methodWithOptionalArguments(arg1, arg2, [arg3])
Used to verify verification of number of method arguments.
@@ -2966,7 +2977,7 @@ UseBundledDependency
.. py:method:: value() -> any
:rtype: any
:rtype: any or undefined
UseCalcBase
16 changes: 10 additions & 6 deletions packages/jsii/lib/assembler.ts
Original file line number Diff line number Diff line change
@@ -604,6 +604,10 @@ export class Assembler implements Emitter {
property.immutable = (ts.getCombinedModifierFlags(signature) & ts.ModifierFlags.Readonly) !== 0;
}

if (signature.questionToken) {
property.type.optional = true;
}

if (property.static && property.immutable && ts.isPropertyDeclaration(signature) && signature.initializer) {
property.const = true;
}
@@ -627,7 +631,7 @@ export class Assembler implements Emitter {
if (parameter.variadic) {
parameter.type = (parameter.type as spec.CollectionTypeReference).collection.elementtype;
}
if (paramDeclaration.initializer != null) {
if (paramDeclaration.initializer || paramDeclaration.questionToken) {
parameter.type.optional = true;
}
this._visitDocumentation(paramSymbol, parameter);
@@ -650,7 +654,7 @@ export class Assembler implements Emitter {

if (!type.symbol) {
this._diagnostic(declaration, ts.DiagnosticCategory.Error, `Non-primitive types must have a symbol`);
return { primitive: spec.PrimitiveType.Any };
return { primitive: spec.PrimitiveType.Any, optional: true };
}

if (type.symbol.name === 'Array') {
@@ -667,7 +671,7 @@ export class Assembler implements Emitter {
this._diagnostic(declaration,
ts.DiagnosticCategory.Error,
`Un-specified promise type (need to specify as Promise<T>)`);
return { primitive: spec.PrimitiveType.Any, promise: true };
return { primitive: spec.PrimitiveType.Any, optional: true, promise: true };
} else {
return {
...await this._typeReference(typeRef.typeArguments[0], declaration),
@@ -689,7 +693,7 @@ export class Assembler implements Emitter {
this._diagnostic(declaration,
ts.DiagnosticCategory.Error,
`Array references must have exactly one type argument (found ${count})`);
elementtype = { primitive: spec.PrimitiveType.Any };
elementtype = { primitive: spec.PrimitiveType.Any, optional: true };
}

return {
@@ -709,7 +713,7 @@ export class Assembler implements Emitter {
this._diagnostic(declaration,
ts.DiagnosticCategory.Error,
`Only string index maps are supported`);
elementtype = { primitive: spec.PrimitiveType.Any };
elementtype = { primitive: spec.PrimitiveType.Any, optional: true };
}
return {
collection: {
@@ -727,7 +731,7 @@ export class Assembler implements Emitter {
}
// tslint:disable-next-line:no-bitwise
if (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
return { primitive: spec.PrimitiveType.Any };
return { primitive: spec.PrimitiveType.Any, optional: true };
}
} else {
switch (type.symbol.name) {

0 comments on commit 91074f3

Please sign in to comment.