diff --git a/lib/tsd-jsdoc/publish.js b/lib/tsd-jsdoc/publish.js
index 20dcc3fb4..22c124420 100644
--- a/lib/tsd-jsdoc/publish.js
+++ b/lib/tsd-jsdoc/publish.js
@@ -314,6 +314,18 @@ function writeInterface(element) {
 
 // handles a single element of any understood type
 function handleElement(element, parent, insideClass) {
+    if (element.optional !== true && element.type && element.type.names && element.type.names.length) {
+        for (let i = 0; i < element.type.names.length; i++) {
+            if (element.type.names[i].toLowerCase() === 'undefined') {
+                // This element is actually optional. Set optional to true and
+                // remove the 'undefined' type
+                element.optional = true;
+                element.type.names.splice(i, 1);
+                i--;
+            }
+        }
+    }
+
     if (seen[element.longname])
         return true;
     if (isClassLike(element)) {
@@ -460,7 +472,10 @@ function handleMember(element, parent) {
         } else
             write(element.kind === "constant" ? "const " : "var ");
 
-        write(element.name, ": ");
+        write(element.name);
+        if (element.optional)
+            write("?");
+        write(": ");
 
         if (element.type && element.type.names && /^Object\b/i.test(element.type.names[0]) && element.properties) {
             writeln("{");