More than just a Transpiler
[].asdf()
TypeError: [].asdf is not a function
[] + []
[] + []
""
[] + {}
[] + {}
"[object Object]"
{} + []
!= {} + []
{} + []
0
{} + {}
{} + {}
"[object Object][object Object]"
V8
{} + {}
NaN
IE
"hello " + 1
Hello 1
"hello " + (-1)
Hello -1
"hello " - 1
NaN
"hello " - 1
"hello" - 1
function add(a,b){ return a+b }
add([], {})
function add(a,b){ return a+b }
add(foo, bar)
let foo = getFoo();
let bar = getBar();
someModule.add(foo,bar);
let foo = [] + []
let bar = {} + []
let baz = [] + {}
let qux = {} + {}
let tix = "" - 123
Linter
+
Transpiler
=
node.on('click', function() {
console.log('clicked!');
})
node.on('click', () => {
console.log('clicked!');
})
node.on('click', function() {
console.log('clicked!');
})
Transpiled
var funcs = [];
// create a bunch of functions
for (var i = 0; i < 3; i++) {
funcs.push(function() {
console.log(i);
})
}
// call them
for (var j = 0; j < 3; j++) {
funcs[j]();
}
var funcs = [];
// create a bunch of functions
for (var i = 0; i < 3; i++) {
funcs.push(function() {
console.log(i);
})
}
// 3 , 3 , 3
const funcs = [];
// create a bunch of functions
for (let i = 0; i < 3; i++) { // Note the use of let
funcs.push(function() {
console.log(i);
})
}
// call them
for (let j = 0; j < 3; j++) {
funcs[j]();
}
var funcs = [];
// create a bunch of functions
for (let i = 0; i < 3; i++) { // Note the use of let
funcs.push(function() {
console.log(i);
})
}
// 0 , 1 , 2
JavaScript
in
Specification
JavaScript
that run in user's
Browsers
JavaScript
in
Specification
JavaScript
that run in user's
Browsers
vs.
You can never provide good documentation without mentioning the types
function leftPad (str, len, ch) {
function add() {
return arguments[0] + arguments[1];
}
function add(num1, num2) {
return num1 + num2;
}
function add(num1, num2) {
return num1 + num2;
}
function add(num1: number, num2: number): number {
return num1 + num2;
}
People's name should be called `displayName`
People have a `userId`
type Person = {
displayName: string,
userId: string,
}
function logName(person: Person) {
console.log(person.displayName)
}
over
class ThrowItAll
{
void show() throws Exception
{
throw new Exception("turtles");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String s[]) throws Exception // Why throws is necessary here ?
{
ThrowItAll o1 = new ThrowItAll();
o1.show3();
}
}
let foo = 123;
// .... later
foo.toPrecision(3); // FINE
let foo: any;
foo = 123;
foo = "Hello world";
// .... later
foo.toPrecision(3); // FINE
type Foo = {
name: string;
}
type Bar = {
name : string;
}
let foo: Foo = { name: "hello" };
let bar: Bar = { name: "world" };
type Foo = {
name: string;
}
type Bar = {
name : string;
}
let foo: Foo = { name: "hello" };
let bar: Bar = { name: "world" };
foo = bar = foo; // FINE
npm install alm -g
Website : alm.tools