forked from TypeScriptToLua/TypeScriptToLua.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path35000c2d.a3503528.js
More file actions
1 lines (1 loc) · 17.8 KB
/
Copy path35000c2d.a3503528.js
File metadata and controls
1 lines (1 loc) · 17.8 KB
1
(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{105:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return c})),a.d(t,"metadata",(function(){return b})),a.d(t,"rightToc",(function(){return i})),a.d(t,"default",(function(){return o}));var n=a(1),r=(a(0),a(212));const c={title:"Caveats"},b={id:"caveats",title:"Caveats",description:"## Feature support",source:"@site/docs/caveats.md",permalink:"/docs/caveats",editUrl:"https://github.com/TypeScriptToLua/TypeScriptToLua.github.io/edit/source/docs/caveats.md",sidebar:"docs",previous:{title:"Configuration",permalink:"/docs/configuration"},next:{title:"Editor Support",permalink:"/docs/editor-support"}},i=[{value:"Feature support",id:"feature-support",children:[]},{value:"Differences from JavaScript",id:"differences-from-javascript",children:[{value:"Type-directed emit",id:"type-directed-emit",children:[]},{value:"Boolean coercion",id:"boolean-coercion",children:[]},{value:"Loose equality",id:"loose-equality",children:[]},{value:"Array Length",id:"array-length",children:[]},{value:"Key Iteration Order",id:"key-iteration-order",children:[]},{value:"Iterating an array with <code>for ... in</code>",id:"iterating-an-array-with-for--in",children:[]}]}],l={rightToc:i};function o({components:e,...t}){return Object(r.b)("wrapper",Object(n.a)({},l,t,{components:e,mdxType:"MDXLayout"}),Object(r.b)("h2",{id:"feature-support"},"Feature support"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Feature"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:"center"}),"Lua 5.1"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:"center"}),"Lua 5.2"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:"center"}),"Lua 5.3"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:"center"}),"LuaJIT"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"(Everything else)"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators"}),"Bitwise operators")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch"}),"Switch statement")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/continue"}),Object(r.b)("inlineCode",{parentName:"a"},"continue"))),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u2714\ufe0f")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise"}),Object(r.b)("inlineCode",{parentName:"a"},"Promise"))),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"}),Object(r.b)("inlineCode",{parentName:"a"},"async"))," / ",Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await"}),Object(r.b)("inlineCode",{parentName:"a"},"await"))),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions"}),"Regular Expressions")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining"}),"Optional Chaining")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator"}),"Nullish Coalescing")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Class_fields#Private_fields"}),"Private Fields")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("a",Object(n.a)({parentName:"td"},{href:"https://www.typescriptlang.org/docs/handbook/jsx.html"}),"JSX")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:"center"}),"\u274c")))),Object(r.b)("h2",{id:"differences-from-javascript"},"Differences from JavaScript"),Object(r.b)("p",null,"This project aims for both compilation results to have the same behavior as much as possible, but not at all costs. Since TypeScript is based on JavaScript it also inherited some of the quirks in JavaScript that are not present in Lua. This is where behavior between Lua and JavaScript compilation targets diverge. TypeScriptToLua aims to keep identical behavior as long as ",Object(r.b)("strong",{parentName:"p"},"sane")," TypeScript is used: if JavaScript-specific quirks are used behavior might differ."),Object(r.b)("p",null,"Below are some of the cases where resulting Lua intentionally behaves different from compiled JS."),Object(r.b)("h3",{id:"type-directed-emit"},"Type-directed emit"),Object(r.b)("p",null,"One of TypeScript's ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/microsoft/TypeScript/wiki/TypeScript-Design-Goals"}),"design goals")," is ",Object(r.b)("strong",{parentName:"p"},"not")," using type information to affect program runtime behavior. Though this has many advantages (such as gradual typing), TypeScriptToLua uses type information extensively. This allows us to emit a much more optimized, portable, and correct Lua code."),Object(r.b)("h3",{id:"boolean-coercion"},Object(r.b)("a",Object(n.a)({parentName:"h3"},{href:"https://developer.mozilla.org/en-US/docs/Glossary/Falsy"}),"Boolean coercion")),Object(r.b)("p",null,"JavaScript and Lua differ in what they evaluate to true/false. TypeScriptToLua adheres to the Lua evaluations."),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"TypeScript"),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("em",{parentName:"th"},"JavaScript behavior")),Object(r.b)("th",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("em",{parentName:"th"},"Lua behavior")))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"undefined")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"null")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"NaN")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"\u26a0\ufe0f",Object(r.b)("inlineCode",{parentName:"td"},"true"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},'""')),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"\u26a0\ufe0f",Object(r.b)("inlineCode",{parentName:"td"},"true"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"0")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"false")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"\u26a0\ufe0f",Object(r.b)("inlineCode",{parentName:"td"},"true"))),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"(Everything else)"),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"true")),Object(r.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"true"))))),Object(r.b)("h3",{id:"loose-equality"},Object(r.b)("a",Object(n.a)({parentName:"h3"},{href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using"}),"Loose equality")),Object(r.b)("p",null,"TypeScriptToLua makes no difference between ",Object(r.b)("inlineCode",{parentName:"p"},"==")," and ",Object(r.b)("inlineCode",{parentName:"p"},"===")," when compiling to Lua, treating all comparisons as strict (",Object(r.b)("inlineCode",{parentName:"p"},"==="),")."),Object(r.b)("h3",{id:"array-length"},"Array Length"),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"Array.prototype.length")," is translated to Lua's ",Object(r.b)("inlineCode",{parentName:"p"},"#")," operator. Due to the way lists are implemented in Lua there can be differences between JavaScript's ",Object(r.b)("inlineCode",{parentName:"p"},"list.length")," and Lua's ",Object(r.b)("inlineCode",{parentName:"p"},"#list"),". The transpiler does not do anything to remedy these differences, so when working with lists, the transpiled Lua will use the standard Lua conventions. Generally speaking, the situation where these differences occur happen when adding/removing items to a list in a hacky way, or when setting list items to ",Object(r.b)("inlineCode",{parentName:"p"},"undefined"),"/",Object(r.b)("inlineCode",{parentName:"p"},"null"),"."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Examples:")),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Safe (no difference):")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-ts"}),"const myList = [1, 2, 3];\nmyList.push(4);\nmyList.pop();\nmyList.splice(1, 1);\n// myList.length == 2\n")),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Differences might occur:")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-ts"}),"const myList = [1, 2, 3];\nmyList[1] = undefined;\n// myList.length == 1 (3 in JavaScript)\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-ts"}),"const myList = [1, 2, 3];\nmyList[4] = 5;\n// myList.length == 3 (5 in JavaScript)\n")),Object(r.b)("h3",{id:"key-iteration-order"},"Key Iteration Order"),Object(r.b)("p",null,"Even though iterating over object keys with ",Object(r.b)("inlineCode",{parentName:"p"},"for ... in")," does not guarantee order in either JavaScript or Lua. Therefore, the iteration order in JavaScript is likely different from the order in Lua."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Note:")," If a specific order is required, it is better to use ordered collections like lists instead."),Object(r.b)("h3",{id:"iterating-an-array-with-for--in"},"Iterating an array with ",Object(r.b)("inlineCode",{parentName:"h3"},"for ... in")),Object(r.b)("p",null,"Not allowed."))}o.isMDXComponent=!0},212:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return s}));var n=a(0),r=a.n(n);function c(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function b(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?b(Object(a),!0).forEach((function(t){c(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):b(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},c=Object.keys(e);for(n=0;n<c.length;n++)a=c[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)a=c[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=r.a.createContext({}),p=function(e){var t=r.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i({},t,{},e)),a},d=function(e){var t=p(e.components);return r.a.createElement(o.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},j=Object(n.forwardRef)((function(e,t){var a=e.components,n=e.mdxType,c=e.originalType,b=e.parentName,o=l(e,["components","mdxType","originalType","parentName"]),d=p(a),j=n,s=d["".concat(b,".").concat(j)]||d[j]||O[j]||c;return a?r.a.createElement(s,i({ref:t},o,{components:a})):r.a.createElement(s,i({ref:t},o))}));function s(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var c=a.length,b=new Array(c);b[0]=j;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,b[1]=i;for(var o=2;o<c;o++)b[o]=a[o];return r.a.createElement.apply(null,b)}return r.a.createElement.apply(null,a)}j.displayName="MDXCreateElement"}}]);